当我执行
for (var i in window) console.log(window[i])
我得到了一个窗口属性和方法的列表。
但是,当我对“Math”对象执行相同操作时,什么也没有显示出来。
typeof "window" == typeof "Math"
返回 TRUE,所以我不明白为什么我的循环不起作用。
奇怪的是,如果我直接写Math['E']
,我会得到常量E的值。
当我执行
for (var i in window) console.log(window[i])
我得到了一个窗口属性和方法的列表。
但是,当我对“Math”对象执行相同操作时,什么也没有显示出来。
typeof "window" == typeof "Math"
返回 TRUE,所以我不明白为什么我的循环不起作用。
奇怪的是,如果我直接写Math['E']
,我会得到常量E的值。
并不是所有的对象属性都是可迭代的。你只能在 for..in
循环中获取可迭代的属性。
由于大多数 window
对象的属性(它恰好是全局对象)都是用户定义的全局变量,所以它们是可枚举的。
在现代 JavaScript 引擎中,你可以使用 Object.getOwnPropertyNames(obj)
来获取所有属性,包括可枚举和不可枚举的:
>>> Object.getOwnPropertyNames(Math)
["toSource", "abs", "acos", "asin", "atan", "atan2", "ceil", "cos", "exp", "floor", "log", "max", "min", "pow", "random", "round", "sin", "sqrt", "tan", "E", "LOG2E", "LOG10E", "LN2", "LN10", "PI", "SQRT2", "SQRT1_2"]
查看获取对象的不可枚举继承属性名称是否可能以了解更多详情。
["max", "ceil", "SQRT2", "PI", "pow", "log",
"LOG2E", "tan", "sqrt", "exp", "random", "min",
"floor", "atan2", "cos", "atan", "acos", "abs",
"round", "asin", "LN2", "LOG10E", "sin",
"E", "SQRT1_2", "LN10"].forEach( function(key ) {
if( Math[key] ) {
console.log( key, Math[key] );
}
});
您可以在现代浏览器中使用 Object.getOwnPropertyNames( Math );
获取这些键的列表。以上代码适用于所有值得注意的浏览器,前提是您已经进行了.forEach的兼容处理
console.log(Object.getOwnPropertyNames(Math));
let a = Object.getOwnPropertyNames(Math);
a.forEach((element) => console.log(element));