对我来说,如果我想检查Object的属性是否存在,我必须确保该对象存在,这似乎很愚蠢。如果一个对象未定义,那么它的所有属性也应该是未定义的。
那么为什么会这样呢
if ( ! Object.property ) {
console.log('Nope!')
} else {
console.log('Yep!')
}
如果对象未定义,则完全中断?将属性验证嵌套在对象验证中是很烦人的。这不应该是一个合法的if语句吗?
答案 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的getObject
和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'
答案 3 :(得分:0)
严格来说,如果您确实要检查是否存在属性,那么最好使用以下代码:
if ( Object && "property" in Object ) {
// defined
} else {
// nope
}
原因是属性可能存在但包含值“undefined”。
有关详情,请查看here