为什么`undefined`不出现在for...in循环中?

4

我对于 for-in 循环有些困惑:

window.hasOwnProperty(undefined) // Returns true

and

undefined in window // Returns true

但是下面的代码并未输出Undefined is in window!

for(a in window) {
     if(a === 'undefined')
         console.log('Undefined is in window!');
}

为什么在 for-in 循环中没有出现 undefined 呢?
1个回答

7

它不是一个可枚举的属性。在现代 JavaScript 引擎中,你可以控制自己对象上的该属性,但“原生”对象通常(也许不是每个解释器)可以从 for ... in 迭代中“隐藏”属性。

你可以在 MDN 上了解有关 Object.defineProperty() 的内容。我不确定是否会有一种语法(在 Harmony 中),用于将属性标记为对象字面量中的不可枚举属性。


1
有没有一种方法可以构建一个函数,该函数返回所有满足 x in windowtruex 值? - Randomblue
2
@Randomblue,我不喜欢说在JavaScript中什么是不可能的,但我认为这里不行;那个“可枚举”标志的重点就在于防止“内部”属性污染命名空间。 - Pointy
2
找到了(https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/getOwnPropertyNames#Cross-browser_compatibility)! - Randomblue
1
@Randomblue:Object.getOwnPropertyNames(window).forEach(function(prop) { window[prop];}); 看起来你已经找到了。 :) - gray state is coming
我知道说“不可能”的话是不明智的 :-) - Pointy
1
@Randomblue:关于 window.undefined 的问题,具体可以参考这里:http://es5.github.com/#x15.1.1.3。 - Felix Kling

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接