如果Object未定义,为什么“if(!Object.property)”会中断?

时间:2012-08-13 14:21:54

标签: javascript

对我来说,如果我想检查Object的属性是否存在,我必须确保该对象存在,这似乎很愚蠢。如果一个对象未​​定义,那么它的所有属性也应该是未定义的。

那么为什么会这样呢

if ( ! Object.property ) {
    console.log('Nope!')
} else {
    console.log('Yep!')
}

如果对象未定义,则完全中断?将属性验证嵌套在对象验证中是很烦人的。这不应该是一个合法的if语句吗?

4 个答案:

答案 0 :(得分:8)

它不起作用,因为查找属性必须首先查找定义该属性(可能)的对象。

就是这样 - 它是语言设计的选择。如果a.b未定义,设计师可以定义undefined始终返回a,但他们没有。{/ p>

作为捷径,您可以使用以下语法:

if (obj && typeof obj.property !== 'undefined') {
    // yep, it's defined (and not just "falsey")
} else {
    // nope
}

答案 1 :(得分:1)

首先,您必须检查对象本身是否已定义。您无法访问不存在的对象的属性或变量。否则你的代码就会破坏。

答案 2 :(得分:0)

如果你想简化这个,你可以看看Ben Alman的getObjectsetObject

http://benalman.com/projects/jquery-getobject-plugin/

var myObj = {};

// Setting.
Cowboy.setObject( 'a.b.c', { d: 1, e: 2 }, myObj ); // returns a.b.c reference

// myObj is now { a: { b: { c: { d: 1, e: 2 } } } }

// Getting.
Cowboy.getObject( 'a.b.c.d', myObj ); // returns 1
Cowboy.getObject( 'a.b.c.x', myObj ); // returns undefined
Cowboy.getObject( 'a.b.c.d.x', myObj ); // returns undefined

// Testing.
Cowboy.exists( 'a.b.c.d', myObj ); // returns true
Cowboy.exists( 'a.b.c.x', myObj ); // returns false
Cowboy.exists( 'a.b.c.d.x', myObj ); // returns false

// I'm not sure why you'd want to do something like this, but it's
// certainly possible...
Cowboy.setObject( 'document.body.style.display', 'none' );
Cowboy.getObject( 'document.body.style.display' ); // returns 'none'

答案 3 :(得分:0)

严格来说,如果您确实要检查是否存在属性,那么最好使用以下代码:

if ( Object && "property" in Object ) {
    // defined
} else {
    // nope
}

原因是属性可能存在但包含值“undefined”。

有关详情,请查看here