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


当前回答

问题归结为三种情况:

对象具有属性,其值未定义。对象具有属性,其值未定义。对象没有属性。

这告诉了我们一些我认为重要的事情:

未定义成员和具有未定义值的已定义成员之间存在差异。

但不幸的是,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); }

但正如前面提到的,这些并不完全相同(但已经足够满足我的需求)。

其他回答

我假设您还想检查它是否未定义或为空。如果是,我建议:

myVar==空

这是唯一一次双等于非常有用,因为当myVar未定义或为null时,它将求值为true,但当它是其他假值(如0、false、“”和NaN)时,它会求值为false。

这是Lodash的isNil方法的实际源代码。

与void 0进行比较,以获得简洁性。

if (foo !== void 0)

它不像(typeoffoo!=='undefined')那样冗长

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

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

or

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

我们ES6可以与!!将所有值转换为布尔值。使用此选项,所有假值都将变为假。

第一种解决方案

if (!(!!variable)) {
    // Code
}

第二种解决方案

if (!variable) {
    // Code
}
function isUnset(inp) {
  return (typeof inp === 'undefined')
}

如果变量已设置,则返回false;如果未定义,则返回true。

然后使用:

if (isUnset(var)) {
  // initialize variable here
}