为什么for(数学中的var i)不在Javascript中遍历Math.*呢?

为什么for(数学中的var i)不在Javascript中遍历Math.*呢?,javascript,Javascript,由于某种原因,(数学中的var i){console.log(i)}在Javascript中没有显示预期的tan、cos、atan2、E、PI。与Javascript中的大多数内置对象一样,Math对象的属性和方法在ECMAScript规范(第15.8.1节)中定义为不可通过(脚本无法访问)枚举DontEnum属性。在ECMAScript 5中,您还可以将自己对象的属性和方法标记为不可枚举: var o = {}; Object.defineProperty(o, "p", { enu

由于某种原因,(数学中的var i){console.log(i)}在Javascript中没有显示预期的tan、cos、atan2、E、PI。

与Javascript中的大多数内置对象一样,
Math
对象的属性和方法在ECMAScript规范(第15.8.1节)中定义为不可通过(脚本无法访问)枚举
DontEnum
属性。在ECMAScript 5中,您还可以将自己对象的属性和方法标记为不可枚举:

var o = {};

Object.defineProperty(o, "p", {
    enumerable: false,
    value: 1
});

Object.defineProperty(o, "q", {
    enumerable: true,
    value: 2
});

for (var i in o) {
    console.log(i + "=>" + o[i]);
}
// q=>2

这些属性是不可枚举的

发件人:

for…in循环不会迭代内置属性


在较新的JavaScript实现中,您可以创建自己的不可枚举属性。签出并删除。

,因为
数学
是一个内置对象,其属性标记为不可枚举。许多内置对象都有这种行为,这就是为什么在数组上循环使用
for..in
不会给您带来问题,直到
array.prototype
使用用户函数进行扩展,默认情况下,这些函数总是可枚举的

直到最近,不可枚举还是常规Javascript代码无法访问的内部属性。但是,EMCAScript 5指定了通过设置任何对象属性的可枚举性和可写性(尝试更改
Math.PI
的值)的功能

它还提供了一种获取对象的所有属性的列表的方法,而不管它们的可枚举性如何

Object.getOwnPropertyNames(Math);

//returns
["LN10", "PI", "E", "LOG10E", "SQRT2", "LOG2E", "SQRT1_2", "LN2", "cos", "pow", "log", "tan", "sqrt", "ceil", "asin", "abs", "max", "exp", "atan2", "random", "round", "floor", "acos", "atan", "min", "sin"]
据我所知,目前支持这些功能的浏览器只有Chrome和Safari。Firefox应该在版本4支持它。IE9我不确定,但微软已经表示他们打算最终支持EMCAScript5标准


如果没有明确的支持,我不相信有任何方法可以在Javascript解释器中模拟此功能。

我一直注意到,当不知道实际的方法时,人们会告诉你不应该这样做

下面是公开给定对象的私有函数的方法

let exposeFunctionsOf  =(obj) =>
{
    let iterated = false
    for ( let k in obj ) 
    {
        iterated = true;
        let prop = obj[k]
        if ( typeof props == "function")
        {
            window[k] = prop
        }
    }
    if (!iterated)
    {
       let props_names = Object.getOwnPropertyNames(obj);
       for (let prop_name of props_names)
       {
          iterated = true;
          let prop = obj[prop_name]
          if ( typeof prop == "function")
            window[prop_name] =prop
       }
    }
    if (!iterated)
    {
      console.warn("failed to iterate through the following object")
      cosnole.log(obj)
    }
}
应用于
数学
对象

exposeFunctionsOf(Math)
现在您可以编写
sin(x)
而不是
Math.sin(x)

享受