当我这样做时
for (var i in window) console.log(window[i])
我得到一个窗口属性和方法列表
当我为#34; Math"做同样的事情时对象,我一无所获。
typeof "window" == typeof "Math"
返回 TRUE ,所以我没有看到我的循环无效的原因。
奇怪,好像我直接写Math['E']
我得到常数 E 的值。
更新
谢谢。所有答案都很有帮助,并提供了我想要的。我赞成他们中的大部分。
答案 0 :(得分:11)
并非所有对象属性都是可迭代的。您只能在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"]
有关详细信息,请参阅Is it possible to get the non-enumerable inherited property names of an object?。
答案 1 :(得分:8)
["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 );
在现代浏览器中获取这些键的列表以上适用于所有值得关注的浏览器shimmed .forEach
答案 2 :(得分:3)
console.log(Object.getOwnPropertyNames(Math));