0

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

那么为什么会有类似的东西

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

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

4

4 回答 4

8

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

就是这样 - 这是一种语言设计选择。设计者可以定义如果未定义a.b总是返回,但他们没有。undefineda

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

if (obj && typeof obj.property !== 'undefined') {
    // yep, it's defined (and not just "falsey")
} else {
    // nope
}
于 2012-08-13T14:24:05.070 回答
1

首先,您必须检查对象本身是否已定义。您无法访问不存在的对象的属性或变量。否则,您的代码会中断,如您所见。

于 2012-08-13T14:24:05.620 回答
0

如果您想简化这一点,您可以查看 Ben Alman 的getObjectand setObject

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'
于 2012-08-13T14:40:17.137 回答
0

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

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

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

欲了解更多信息,请查看此处

于 2012-08-13T14:48:06.400 回答