propertyIsEnumerable(x)与x in

时间:2012-10-04 13:47:50

标签: javascript properties enumeration enumerable

我在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
}

2 个答案:

答案 0 :(得分:3)

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

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

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

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

  •   

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

现在让我们来看看in operator

  

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

如果你看一下[[HasProperty]] internal method

  

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

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

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

答案 1 :(得分:0)

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

if (x in o)

另一个没有。它只关注“自己的”属性。

if (o.propertyIsEnumerable(x))