使用 for in 循环遍历 window 对象

Iterating through window object using for in loop

基本上我想打印 window 对象的所有属性,我正在使用:

for(var k in window){
document.write("window object = "+ Object.getOwnPropertyNames(window[k])+ "<br>");
}

我得到一个奇怪的输出,code.I 想使用 for in 在新行上打印每个 属性,我该怎么做?谢谢!

Object.getOwnPropertyNames(window) 应该为您提供 window 对象拥有的所有 属性 名称。然后为了在控制台中打印所有名称,您可以在数组上使用 forEach 方法。

Object.getOwnPropertyNames(window).forEach(function(currentValue){console.log(currentValue)});

你可以这样做,getOwnPropertyNames returns 一个数组,你可以使用 forEach 迭代它。

Object.getOwnPropertyNames(window)
    .forEach(function(object) {
            document.writeln(object+"<br/>");
    });

为什么要使用 for/in,为什么要使用 document.write

第一个来自遗留 JavaScript,在我们将适当的对象键迭代直接融入 JavaScript 语言之前,因为它是 bad idea(tm) depending on what you're iterating, with more appropriate modern functions available, should not be used anymore. The second is an ancient low level function that absolutely does not do what you think it does 并且应该 永远不会 在现代代码中使用。这是非常危险的,任何仍然使用它的教程告诉你使用它都应该为自己感到羞耻。

所以:用现代 JS 解决你的问题,而不是遗留甚至过时的 JS。要获取对象的所有键,请使用 Object.keys(...),如果您只想查看对象中的内容,请使用控制台 API(console.log 等)。

Object.keys(window).forEach( key => {
  let type =  typeof window[key];
  console.log(`${key} (${type})`);
});

完成。

每个 window 属性 和函数在其自己的行中列出,并列出类型,因为您通常想知道它。另请注意 array.forEach call: JavaScript has a ton of super useful array functions, well worth giving the available functions a quick read through. Finally, this code uses an arrow function, which is a rather nice new piece of JS syntax. You don't have to use it, but it's super compact without sacrificing readability. It also uses a template literals 而不是字符串文字,这是另一个非常方便的现代 JS 功能。在这种情况下,上面的代码和下面的代码是等价的:

Object.keys(window).forEach( function(key) {
  var type =  typeof window[key];
  console.log(key + " (" + type + ")");
});

(如果我们使用单行箭头函数,或者箭头函数体使用 this,它们是 not 等价的 - 同样,值得给出解释箭头功能快速通读)

这涵盖了所有可枚举的属性,这通常是您想要的。在极不可能的情况下,您需要可枚举的 不可枚举的属性,您可以使用 Object.getOwnProperties(...).

如果您想在 HTML 中打印 div 内的所有属性:

var div = document.createElement("div");
document.body.appendChild(div);

var obj = window;

do Object.getOwnPropertyNames(obj).forEach(function(name) {
    div.innerHTML = div.innerHTML + name + "<br/>";
  });
while(obj = Object.getPrototypeOf(obj));

部分代码取自 another Whosebug answer