检测未定义的对象属性
我相信有许多错误的答案关于这个话题。与常见的信念相反, "undefined" 不是 JavaScript 中的关键字,实际上可以给它赋值。
正确的代码
执行这个测试最强大的方法是:
if (typeof myVar === "undefined")
这将始终返回正确的结果,甚至处理 myVar
没有声明的情况。
退化的代码。不要使用。
var undefined = false; // Shockingly, this is completely legal! if (myVar === undefined) { alert("You have been misled. Run away!"); }
另外,myVar === undefined
在 myVar 未声明的情况下会引发错误。
检查属性值是否为特殊值undefined
的常规方法是:
if(o.myProperty === undefined) { alert("myProperty value is the special value `undefined`"); }
检查对象是否实际上没有这样的属性,并且在尝试访问它时默认返回undefined
:
if(!o.hasOwnProperty('myProperty')) { alert("myProperty does not exist"); }
检查与标识符关联的值是否为特殊值undefined
,或者是否未声明该标识符:
if(typeof myVariable === 'undefined') { alert('myVariable is either the special value `undefined`, or it has not been declared'); }
注意:此最后一种方法是在没有早期错误的情况下引用未声明的标识符的唯一方法,这与具有undefined
值不同。
在ECMAScript 5之前的JavaScript版本中,全局对象上命名为“undefined”的属性是可写的,因此如果意外重新定义了它,简单的检查foo === undefined
可能会出现意想不到的行为。在现代JavaScript中,该属性是只读的。
但是,在现代JavaScript中,“undefined”不是关键字,因此函数内部的变量可以被命名为“undefined”,并隐藏全局属性。
如果您担心这种(不太可能的)边缘情况,可以使用void运算符获取特殊的undefined
值本身:
if(myVariable === void 0) { alert("myVariable is the special value `undefined`"); }