【问题标题】:What's the correct way to test for existence of a property on a JavaScript Object?测试 JavaScript 对象上是否存在属性的正确方法是什么?
【发布时间】:2010-10-28 03:12:59
【问题描述】:

我有一个使用 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,但它可能是一个空对象或数组。但是,如果您想在可能的情况下包括正确的方法是什么,请随意。

【问题讨论】:

    标签: javascript object properties


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      如果您正在寻找在对象中定义的属性,您可以使用对象的 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 值不会让您感到困惑。

      【讨论】:

        【解决方案3】:

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

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

        也可以用于properties

        【讨论】:

        • 请注意这个答案依赖于“该值永远不会被设置为空或未定义”,通常情况并非如此,答案将是不正确的。例如。当var obj = {prop: undefined}typeof obj.prop 也会返回undefined
        猜你喜欢
        • 2010-10-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多