o.propertyIsEnumerable(x)
我在Javascript代码中遇到了该方法。我将其理解为x in o
构造的同义词。有区别吗?如果是这样,您能否在一些实际示例中说明何时使用第一个构造以及何时使用第二个构造?
var o = {};
o.x = 1;
o.y = 2;
if ("x" in o) {
// some code
}
if (o.propertyIsEnumerable(x)) {
// some code
}
o.propertyIsEnumerable(x)
我在Javascript代码中遇到了该方法。我将其理解为x in o
构造的同义词。有区别吗?如果是这样,您能否在一些实际示例中说明何时使用第一个构造以及何时使用第二个构造?
var o = {};
o.x = 1;
o.y = 2;
if ("x" in o) {
// some code
}
if (o.propertyIsEnumerable(x)) {
// some code
}
解决此类问题的最简单方法是遵循规范中的算法。这就是它告诉我们的propertyIsEnumerable
:
令 desc 为调用O的 [[GetOwnProperty]] 内部方法并将P作为参数传递的结果。
如果 desc 未定义,则返回 false。
返回desc .[[Enumerable]] 的值。
如您所见,它将调用相关对象的[[GetOwnProperty]]
内部方法。这只是从对象本身(而不是从其原型链中的任何内容)返回指定属性的值。
现在让我们看一下in
运算符:
返回使用参数 ToString(lval) 调用rval的 [[HasProperty]] 内部方法的结果。
如果您查看[[HasProperty]]
内部方法:
令 desc 为调用O的 [[GetProperty]] 内部方法的结果,属性名为P
在这里你可以看到不同之处。in
操作符导致使用[内部[[GetProperty]]
方法][4],而不是[[GetOwnProperty]]
方法,这意味着它将找到原型链中对象的属性。
另一个主要区别是您可以在对象上定义不可枚举的属性(使用Object.defineProperty
方法)。如果你定义了一个不可枚举的属性,它将由操作in
符返回,但显然不是由propertyIsEnumerable
方法返回。这是一个演示差异的小提琴。
这考虑了原型属性并且没有考虑可枚举性。
if (x in o)
另一个没有。它只查看“自己的”属性。
if (o.propertyIsEnumerable(x))