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

时间:2009-05-22 04:11:51

标签: javascript object properties

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

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

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

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

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

3 个答案:

答案 0 :(得分:30)

hasOwnProperty 正好您要查找的内容,因为您指定“如果为此对象显式定义属性,而不是在原型链中”。 Per https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Object/hasOwnProperty,“此方法可用于确定对象是否具有指定属性作为该对象的直接属性;与in运算符不同,此方法不会检查对象的原型链。” - 似乎完全符合您的要求!

答案 1 :(得分:8)

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

myObject = new MyObject();
// some code
if ( myObject.hasOwnProperty('prop') ) {
    // prop exists
}

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

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

if ( myObject.prop !== undefined ) {
    // prop exists
}

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

if ( myObject.prop ) {
}
如果“prop”具有false或null值,则

可能有错误的结果。但通过使用!==运算符与undefined进行比较,您可以确定null / false值不会让您感到困惑。

答案 2 :(得分:2)

您可以按如下方式检查variable是否存在:

if ( typeof variable === 'undefined' || variable === null ) {
    // Do stuff
}

它也可以用于properties