出于某种原因(数学中的var i){console.log(i)}在Javascript中没有显示预期的tan,cos,atan2,E,PI.
Moo*_*Goo 15
因为Math是内置对象,其属性标记为不可枚举.许多内置对象都有这种行为,这就是为什么循环遍历数组for..in不会给你带来问题,直到Array.prototype使用用户函数进行扩展,默认情况下这些函数总是可枚举的.
直到最近,不可枚举的内部属性无法通过常规Javascript代码访问.但是,EMCAScript 5指定了Math.PI通过Object.defineProperty()设置任何对象属性的可枚举性和可写性(尝试更改其值)的功能.
它还提供了Object.getOwnPropertyNames()作为获取对象的所有属性列表的方法,无论它们的可枚举性如何.
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"]
Run Code Online (Sandbox Code Playgroud)
据我所知,目前仅支持这些功能的浏览器是Chrome和Safari.Firefox应该在版本4支持它.IE9我不确定,但微软已声明他们打算最终支持EMCAScript 5标准.
我不相信有任何方法可以在没有明确支持的情况下在Javascript解释器中模拟此功能.
与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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1147 次 |
| 最近记录: |