测试JavaScript对象上是否存在属性的正确方法是什么?

Rud*_*ski 21 javascript properties object

我有一个我创建的自定义Javascript对象new,并根据创建参数分配属性:

function MyObject(argument) {
    if (argument) {
        this.prop = "foo";
    }
}
var objWithProp = new MyObject(true); // objWithProp.prop exists
var objWithoutProp = new MyObject(false); // objWithoutProp.prop does not exist
Run Code Online (Sandbox Code Playgroud)

测试prop对象属性是否存在的正确方法是什么?我已经看到了以下使用的方法,但我不确定这些方法中的任何一种是否是最佳方式:

  • if (obj.prop) {}
  • if (obj.hasOwnProperty("prop")) {}
  • if ("prop" in obj) {}

具体来说,我只对测试是否为该对象明确定义属性感兴趣,而不是在原型链中.此外,该值永远不会设置为nullundefined,但它可能类似于空对象或数组.但是,如果你想包括正确的方法,如果可能的话,请随意.

Ale*_*lli 30

hasOwnProperty正是你要找的东西,因为你指定"如果该属性是该对象明确定义,而不是在原型链".根据https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Object/hasOwnProperty,"此方法可用于确定对象是否具有指定属性作为该对象的直接属性;与in运算符不同,这种方法不会检查对象的原型链." - 似乎完全符合您的要求!


far*_*zad 8

如果要查找对象中定义的属性,可以使用该对象的hasOwnProperty方法.像这样:

myObject = new MyObject();
// some code
if ( myObject.hasOwnProperty('prop') ) {
    // prop exists
}
Run Code Online (Sandbox Code Playgroud)

但这只是要知道对象本身是否定义了这样的属性,而不是它的父节点.所以如果对象继承了这样的属性,你就不能像这样测试它的存在.

另一种方法是针对未定义的值测试属性.像这样:

if ( myObject.prop !== undefined ) {
    // prop exists
}
Run Code Online (Sandbox Code Playgroud)

记得使用!==运算符而不是!=因为!=在null和undefined之间没有区别,但是!==确实如此.因此,如果您的对象具有属性但值为null,则!=将无法帮助您.所以这个测试:

if ( myObject.prop ) {
}
Run Code Online (Sandbox Code Playgroud)

如果"prop"具有false或null值,则可能会出现错误结果.但通过使用!==运算符与undefined进行比较,您可以确定null/false值不会让您感到困惑.