如何检查JavaScript中的对象属性是否未定义?
当前回答
与void 0进行比较,以获得简洁性。
if (foo !== void 0)
它不像(typeoffoo!=='undefined')那样冗长
其他回答
问题归结为三种情况:
对象具有属性,其值未定义。对象具有属性,其值未定义。对象没有属性。
这告诉了我们一些我认为重要的事情:
未定义成员和具有未定义值的已定义成员之间存在差异。
但不幸的是,obj.foo的类型并不能告诉我们这三种情况中的哪一种。然而,我们可以将其与obj中的“foo”结合起来,以区分情况。
| typeof obj.x === 'undefined' | !("x" in obj)
1. { x:1 } | false | false
2. { x : (function(){})() } | true | false
3. {} | true | true
值得注意的是,这些测试对于空条目也是相同的
| typeof obj.x === 'undefined' | !("x" in obj)
{ x:null } | false | false
我认为,在某些情况下,检查属性是否存在比检查是否未定义更有意义(而且更清楚),而这种检查唯一不同的情况是情况2,这是对象中实际条目具有未定义值的罕见情况。
例如:我刚刚重构了一堆代码,这些代码对对象是否具有给定属性进行了大量检查。
if( typeof blob.x != 'undefined' ) { fn(blob.x); }
如果不检查未定义,则更清楚。
if( "x" in blob ) { fn(blob.x); }
但正如前面提到的,这些并不完全相同(但已经足够满足我的需求)。
“if(window.x){}”是错误安全的
很可能您想要if(window.x)。即使x尚未声明(var x;),该检查也是安全的-浏览器不会抛出错误。
示例:我想知道我的浏览器是否支持历史API
if (window.history) {
history.call_some_function();
}
工作原理:
window是一个包含所有全局变量作为其成员的对象,尝试访问不存在的成员是合法的。如果x尚未声明或未设置,则window.x返回undefined。undefined在if()求值时导致false。
我假设您还想检查它是否未定义或为空。如果是,我建议:
myVar==空
这是唯一一次双等于非常有用,因为当myVar未定义或为null时,它将求值为true,但当它是其他假值(如0、false、“”和NaN)时,它会求值为false。
这是Lodash的isNil方法的实际源代码。
查看注释,对于那些想同时检查两者的人来说,它是未定义的还是其值为空:
//Just in JavaScript
var s; // Undefined
if (typeof s == "undefined" || s === null){
alert('either it is undefined or value is null')
}
如果您使用的是jQueryLibrary,那么jQuery.isEmptyObject()将足以满足这两种情况,
var s; // Undefined
jQuery.isEmptyObject(s); // Will return true;
s = null; // Defined as null
jQuery.isEmptyObject(s); // Will return true;
//Usage
if (jQuery.isEmptyObject(s)) {
alert('Either variable:s is undefined or its value is null');
} else {
alert('variable:s has value ' + s);
}
s = 'something'; // Defined with some value
jQuery.isEmptyObject(s); // Will return false;
我没有看到(希望我没有错过)任何人在物业前检查该对象。因此,这是最短和最有效的(虽然不一定是最清楚的):
if (obj && obj.prop) {
// Do something;
}
如果obj或obj.prop为undefined、null或“falsy”,If语句将不执行代码块。这通常是大多数代码块语句(在JavaScript中)所需的行为。
更新:(2021 7月2日)
最新版本的JavaScript为可选链接:?。
这可能是检查对象财产是否存在的最明确、最有效的方法。
裁判:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Optional_chaining