为什么for(数学中的var i)不在Javascript中遍历Math.*呢?
由于某种原因,(数学中的var i){console.log(i)}在Javascript中没有显示预期的tan、cos、atan2、E、PI。与Javascript中的大多数内置对象一样,为什么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
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)
享受