【发布时间】:2012-08-27 17:18:10
【问题描述】:
for-in 循环将遍历对象的所有可枚举属性,甚至包括原型链中的属性。函数hasOwnProperty 可以过滤掉原型链中的那些可枚举属性。最后,函数propertyIsEnumerable可以区分对象的可枚举属性。
因此,以下脚本不应打印任何内容:
for(a in window)
if(window.hasOwnProperty(a) && !window.propertyIsEnumerable(a))
console.log(a);
然而,在 Chrome 上,上面会打印 很多 属性名称。
为什么for-in 循环和propertyIsEnumerable 在可枚举方面相互矛盾?
【问题讨论】:
-
在 Firefox 14 (fiddle) 上为我打印的零属性。
-
请记住,
window是 host 变量,不必完全遵循规范。 -
是的,这很奇怪。
window.propertyIsEnumerable('Int8Array')是假的,但Object.getOwnPropertyDescriptor(window, 'Int8Array').enumerable是真的。根据规格,它们应该是相等的。 -
主机对象的东西是allowed,但是:“主机对象可以支持这些内部属性以及任何依赖于实现的行为”——即
[[GetOwnProperty]],它是包含enumerable的描述符。 -
例如:"主机对象可以以任何方式实现这些内部方法,除非另有说明;例如,一种可能性是 [[Get]] 和 [[Put]] 用于特定的宿主对象确实获取和存储属性值,但 [[HasProperty]] 总是生成 false。" es5.github.com/#x8.6.2。我不是说这里就是这种情况,它可能确实是一个错误,但必须牢记。