2010-08-03 9 views

Respuesta

14

Porque Math es un objeto incorporado cuyas propiedades están marcadas no numerable. Muchos objetos incorporados tienen este comportamiento, que es la razón por la que recorrer una matriz con for..in no le dará problemas hasta que Array.prototype se extienda con funciones de usuario, que siempre son enumerables por defecto.

Hasta hace poco tiempo no enumerable era una propiedad interna a la que no se puede acceder mediante el código JavaScript normal. Sin embargo, EMCAScript 5 especifica la capacidad de establecer la enumerabilidad y la capacidad de escritura (intente cambiar el valor de Math.PI) de cualquier propiedad de objeto a través de Object.defineProperty().

También proporciona Object.getOwnPropertyNames() como una forma de obtener una lista de todas las propiedades de un objeto independientemente de su enumerabilidad.

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"] 

Por lo que sé, los únicos navegadores que actualmente admiten estas funciones son Chrome y Safari. Firefox debería soportarlo en la versión 4. IE9 de lo que no estoy seguro, pero Microsoft ha declarado que pretenden apoyar el estándar EMCAScript 5 eventualmente.

No creo que haya ninguna forma de emular esta funcionalidad en los intérpretes de Javascript sin soporte explícito.

5

Al igual que la mayoría de los objetos incorporados en JavaScript, las propiedades y métodos del objeto Math se definen en la especificación ECMAScript (sección 15.8.1) como no enumerables mediante el atributo DontEnum (inaccesible). En ECMAScript 5, puede marcar propiedades y métodos de sus propios objetos como no-numerable también:

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 
+1

Me pregunto por qué ... – You