【问题标题】:propertyIsEnumerable(x) versus x inpropertyIsEnumerable(x) 与 x in
【发布时间】:2012-09-25 13:48:41
【问题描述】:

我在 Javascript 代码中遇到了 o.propertyIsEnumerable(x) 方法。我将其理解为 x in o 构造的同义词。有区别吗?如果是这样,您能否在一些实际示例中说明何时使用第一个构造以及何时使用第二个构造?

var o = {};
o.x = 1;
o.y = 2;

if ("x" in o) {
 // some code
}

if (o.propertyIsEnumerable(x)) {
  // some code
}

【问题讨论】:

    标签: javascript properties enumeration enumerable


    【解决方案1】:

    解决此类问题的最简单方法是遵循规范中的算法。这就是它告诉我们的关于propertyIsEnumerable

    • 设 desc 是调用 O 的 [[GetOwnProperty]] 内部方法并传递 P 作为参数的结果。

    • 如果 desc 未定义,则返回 false。

    • 返回desc的值。[[Enumerable]]。

    如您所见,它将调用相关对象的[[GetOwnProperty]] internal method。这只是从对象本身(而不是从其原型链中的任何东西)返回指定属性的值。

    现在让我们看看in operator

    返回调用rval的[[HasProperty]]内部方法的结果,参数为ToString(lval)。

    如果你看看[[HasProperty]] internal method:

    令 desc 为调用 O 的 [[GetProperty]] 内部方法的结果,属性名为 P

    在这里您可以看到不同之处。 in 运算符导致使用 [[[GetProperty]] 内部方法][4],而不是 [[GetOwnProperty]] 方法,这意味着它将查找原型链中对象的属性。

    另一个主要区别是您可以在对象上定义不可枚举的属性(使用Object.defineProperty 方法)。如果您定义了一个不可枚举的属性,它in 运算符返回,但显然不是由propertyIsEnumerable 方法返回。这是fiddle that demonstrates the difference

    【讨论】:

      【解决方案2】:

      这考虑了原型属性,没有考虑可枚举性。

      if (x in o)
      

      另一个没有。它只查看“自己的”属性。

      if (o.propertyIsEnumerable(x))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-29
        • 1970-01-01
        • 2017-12-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多