如何列出Math对象的所有属性?

19

当我执行

for (var i in window) console.log(window[i])

我得到了一个窗口属性和方法的列表。

但是,当我对“Math”对象执行相同操作时,什么也没有显示出来。

typeof "window" == typeof "Math"

返回 TRUE,所以我不明白为什么我的循环不起作用。

奇怪的是,如果我直接写Math['E'],我会得到常量E的值。

4个回答

19

并不是所有的对象属性都是可迭代的。你只能在 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"]

查看获取对象的不可枚举继承属性名称是否可能以了解更多详情。


谢谢解释!但是在这种情况下,有办法枚举Math对象的属性吗? - lukas.pukenis

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 ); 获取这些键的列表。以上代码适用于所有值得注意的浏览器,前提是您已经进行了.forEach的兼容处理


谢谢!我不知道getOwnPropertyNames。 - lukas.pukenis

4
console.log(Object.getOwnPropertyNames(Math));

0
这个怎么样?
let a = Object.getOwnPropertyNames(Math);
a.forEach((element) => console.log(element));

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