2

目前,我有一个定义如下的函数:

function a(b,c) {
 if (typeof(b) === "undefined") { b = 1; }
 if (typeof(c) === "undefined") { c = 2; }
 ...
}

之前,如果值是假的,它会设置为默认值。更改它会中断以下调用:

a(null, 3);

没有未定义的对象。我怎样才能只传递第二个参数?

实际上,有一个未定义的对象:

通常可能有一个未定义的对象,但显然在我的环境中出现了问题

4

3 回答 3

4

实际上,有一个undefined对象:

a(undefined, 3);

但是,由于某种原因,它是一个变量,因此有人可以这样做:

undefined = 2;

您的代码将不再起作用。如果您想保护自己免受重新定义的人的影响undefined,您可以这样做:

a(void 0 /* zero's not special; any value will do */, 3);

void前缀运算符接受一个值,丢弃它,然后返回undefined

于 2013-01-12T04:20:36.780 回答
3

检查变量是否存在的一个很好的测试是:

(typeof b === "undefined" || b === null)

因此,您的函数可以这样重写:

function a(b,c) {
   if (typeof(b) === "undefined" || b === null) { b = 1; }
   if (typeof(c) === "undefined" || b === null) { c = 2; }
   ...
}

这将解释任何undefined,nullvoid 0作为参数传递。如果你发现重复,你总是可以定义一个效用函数:

function exists(obj) {
    return typeof(obj) === "undefined" || obj === null;
}

而这个精确的测试就是Coffee-script用它的存在运算符所做的?。Coffee-script 也提供默认参数,这将使您的生活更加轻松。

于 2013-01-12T04:21:22.107 回答
0

不知道你为什么说没有未定义...

a(undefined, 3)

是你想要的

于 2013-01-12T04:20:29.727 回答