2

将变量与未定义进行比较是否不安全?

if(foo == undefined)

对比

if(foo == 'undefined')

第一个例子足够了吗?或者应该是类似的东西

if('undefined' in window){
     //compare against undefined
} else {
    //compare against 'undefined'
}

因为undefined存在于window物体上?它会存在于所有浏览器中吗?还是我应该简单地比较== 'undefined'?我在 SO 上发现了一些类似的问题,但没有关于 window 对象上存在未定义属性的答案。

4

5 回答 5

1

我建议你typeof改用:

if (typeof foo == "undefined") {
    // ...
}

请注意,这会typeof返回一个字符串,因此您应该始终将其与字符串值进行比较。

于 2012-09-22T18:32:11.373 回答
1

foo == undefined我认为您在and之间混淆了typeof foo == "undefined"

除非变量undefined已设置为当前范围内的其他值,否则两者都会产生相同的结果。在这种情况下,foo == undefined将与之进行比较, where-astypeof foo == "undefined"仍将正确解析。

var undefined = 4;
var reallyUndefined;

reallyUndefined == undefined; // false
typeof reallyUndefined == undefined; // true

它是否是一个真实世界的场景是否undefined会被设置为其他东西是有争议的,我会质疑这样做的库/代码的有效性......但是,因此,始终使用typeof foo === "undefined".

我也会对使用foo == undefinedagainst保持警惕foo === undefined(注意三等号,它不使用类型强制,与之相比==)。

使用==,你会冒这样的风险null == undefined; // true, where-as null === undefined; // false。这是一个很好的例子,说明了为什么你应该总是使用===.


tl;博士typeof foo === "undefined";

于 2012-09-22T18:33:44.330 回答
1
if (foo === undefined)

是安全的

于 2012-09-22T18:34:08.660 回答
1

有几种方法可以做到这一点,但我发现最简单的是:

if(foo === undefined){
  //do stuff
}
于 2012-09-22T18:34:58.150 回答
1

如果您完全控制了所有代码,并且您知道您不必担心有人会胡闹,undefined那么与它进行比较是安全的。

alert(window.foo === undefined);

另一方面,如果你想更偏执一点,你可以做一个不受外界影响的 typeof 检查

alert(typeof window.foo == 'undefined')

第三种选择是拥有自己的、本地的、未定义的变量。

function testme(a, undefined) {
   alert(a === undefined); // Will be false.
}

testme(10);
于 2012-09-22T18:35:14.353 回答