Ran*_*lue 13 javascript google-chrome
A for- in循环将遍历对象的所有可枚举属性,甚至是原型链中的那些属性.该函数hasOwnProperty可以过滤掉原型链中的可枚举属性.最后,该函数propertyIsEnumerable可以区分对象的可枚举属性.
因此,以下脚本不应该打印任何内容:
for(a in window)
if(window.hasOwnProperty(a) && !window.propertyIsEnumerable(a))
console.log(a);
Run Code Online (Sandbox Code Playgroud)
但是,在Chrome上,上面打印了很多属性名称.
为什么for- in循环并且propertyIsEnumerable在可枚举方面相互矛盾?
可悲的事实是 JavaScript 引擎并不相同。虽然符合 ES5 的引擎将尽职尽责地尊重其属性的可枚举性,window但正如上面 pimvdb 和 Felix 所指出的,它是一个主机对象,并且不受 ES5 规则的约束。
您可以看到更多有关window对象实际所在位置的证据window.constructor,这将显示它是由
function Window() { [native code] }
Run Code Online (Sandbox Code Playgroud)
因此,我们没有真正的方法来确定为什么某些属性是可枚举的(根据 Chrome 的说法),而其他属性则不是来自 JavaScript 运行时。
但是,您仍然可以根据其 MDN 文章“返回在给定对象上找到的所有自己的可枚举属性的数组”window来查看 Chrome 不一致的可枚举属性的完整状态。Object.keys(window)
这样做仍然会返回一个包含 30 多个属性的数组。这归因于 Chrome 的奇怪之处!
编辑:通过一些进一步的测试,我找到了 Chrome 理解 的可window枚举属性的正确方法
Object.keys(window).filter(function(prop) {
return window.hasOwnProperty(prop) && !window.propertyIsEnumerable(prop);
});
Run Code Online (Sandbox Code Playgroud)
在 Chrome 中,似乎枚举的候选属性列表for...in并不是由 返回的Object.keys,但实际上更接近于Object.getOwnPropertyNames列出可枚举和不可枚举属性。然而,即使这样也是不一致的。在我的测试中,和的属性列表分别window.hasOwnProperty(prop) && !window.propertyIsEnumerable(prop)为 423 和 454 。for...inObject.getOwnPropertyNames
| 归档时间: |
|
| 查看次数: |
573 次 |
| 最近记录: |