如果我想检查对象的属性是否存在,我必须确保该对象存在,这对我来说似乎很愚蠢。如果一个对象是未定义的,那么它的所有属性也应该是未定义的。
那么为什么会有类似的东西
if ( ! Object.property ) {
console.log('Nope!')
} else {
console.log('Yep!')
}
如果对象未定义,则完全中断?将属性验证嵌套在对象验证中很烦人。这不应该总是一个合法的 if 语句吗?
如果我想检查对象的属性是否存在,我必须确保该对象存在,这对我来说似乎很愚蠢。如果一个对象是未定义的,那么它的所有属性也应该是未定义的。
那么为什么会有类似的东西
if ( ! Object.property ) {
console.log('Nope!')
} else {
console.log('Yep!')
}
如果对象未定义,则完全中断?将属性验证嵌套在对象验证中很烦人。这不应该总是一个合法的 if 语句吗?
它不起作用,因为查找属性必须首先查找定义该属性(可能)的对象。
就是这样 - 这是一种语言设计选择。设计者可以定义如果未定义a.b
总是返回,但他们没有。undefined
a
作为捷径,您可以使用以下语法:
if (obj && typeof obj.property !== 'undefined') {
// yep, it's defined (and not just "falsey")
} else {
// nope
}
首先,您必须检查对象本身是否已定义。您无法访问不存在的对象的属性或变量。否则,您的代码会中断,如您所见。
如果您想简化这一点,您可以查看 Ben Alman 的getObject
and 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'
严格来说,如果您实际上是在检查属性是否存在,那么最好使用以下代码:
if ( Object && "property" in Object ) {
// defined
} else {
// nope
}
原因是属性可能存在但包含值“未定义”。
欲了解更多信息,请查看此处