如何检查JavaScript中的对象属性是否未定义?


当前回答

同样的事情也可以写得更短:

if (!variable){
    // Do it if the variable is undefined
}

or

if (variable){
    // Do it if the variable is defined
}

其他回答

我找到了这篇文章,《在JavaScript中处理未定义的7个技巧》,它展示了关于未定义的真正有趣的事情如:

undefined的存在是JavaScript的许可性质的结果,允许使用:

未初始化变量不存在的对象财产或方法访问数组元素的越界索引不返回任何内容的函数的调用结果

以下是我的情况:

我正在使用REST调用的结果。结果应该从JSON解析为JavaScript对象。

有一个错误我需要辩护。如果REST调用的参数不正确,并且用户指定了错误的参数,则REST调用基本上返回为空。

在使用这篇文章来帮助我抵御这一挑战时,我尝试了这样做:

if( typeof restResult.data[0] === "undefined" ) { throw  "Some error"; }

对于我的情况,如果restResult.data[0]==“object”,那么我可以安全地开始检查其余成员。如果未定义,则抛出上述错误。

我想说的是,就我的情况而言,本文中之前的所有建议都不起作用。我并不是说我是对的,每个人都是错的。我根本不是一个JavaScript大师,但希望这会对某人有所帮助。

在JavaScript中,存在null和undefined。它们有不同的含义。

undefined表示变量值尚未定义;不知道值是多少。null表示变量值被定义并设置为null(没有值)。

Marijn Haverbeke在他的免费在线书《Eloquent JavaScript》(我的重点)中写道:

还有一个类似的值null,其含义是“此值已定义,但没有值”。undefined和null之间的含义差异主要是学术性的,通常不太有趣。在实际程序中,经常需要检查某个东西是否“有价值”。在这些情况下,可以使用表达式something==undefined,因为即使它们不是完全相同的值,null==undefine也会产生true。

所以,我想最好的检查方法是:

if (something == undefined)

对象财产的工作方式应该相同。

var person = {
    name: "John",
    age: 28,
    sex: "male"
};

alert(person.name); // "John"
alert(person.fakeVariable); // undefined

我认为这个问题有很多不正确的答案。与通常的看法相反,“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的情况下引发错误。

检查属性值是否为未定义的特殊值的通常方法是:

if(o.myProperty === undefined) {
  alert("myProperty value is the special value `undefined`");
}

要检查对象是否实际上没有这样的属性,并且当您尝试访问它时,默认情况下会返回undefined:

if(!o.hasOwnProperty('myProperty')) {
  alert("myProperty does not exist");
}

要检查与标识符关联的值是否为未定义的特殊值,或者该标识符是否尚未声明:

if(typeof myVariable === 'undefined') {
  alert('myVariable is either the special value `undefined`, or it has not been declared');
}

注意:最后一个方法是引用未声明的标识符而不出现早期错误的唯一方法,这与值为undefined不同。

在ECMAScript 5之前的JavaScript版本中,全局对象上名为“undefined”的属性是可写的,因此,如果不小心重新定义了foo==undefineed,则简单的检查可能会出现意外的行为。在现代JavaScript中,属性是只读的。

然而,在现代JavaScript中,“undefined”不是关键字,因此函数内部的变量可以命名为“undefine”,并隐藏全局属性。

如果您担心这种(不太可能的)边缘情况,可以使用void运算符获取特殊的未定义值本身:

if(myVariable === void 0) {
  alert("myVariable is the special value `undefined`");
}