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

26

我有一个自定义的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

如何正确地测试对象是否存在prop属性?我见过以下几种方式,但不确定哪种方式是最佳的:

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

具体来说,我只对显式定义在该对象上的属性感兴趣,而不是原型链中的属性。此外,该属性值永远不会被设置为nullundefined,但它可能是一个空对象或数组。如果你想包括这些情况下的正确方式,也可以提供。

3个回答

35

9

如果您要查找对象中定义的属性,可以使用对象的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值不会使您困惑。


4

您可以按照以下方式检查一个 变量 是否存在:

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

它也可以用于 属性


请注意,此答案依赖于“该值永远不会被设置为null或undefined”,通常情况下并非如此,否则答案将是不正确的。例如,当var obj = {prop: undefined}时,typeof obj.prop也将返回undefined - Jan Molnár

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接