Sabemos que un objeto es una "bolsa" de keys (propiedades) y values (valores). Por ejemplo si ejecutamos el siguiente código:
var obj = { a: 1 };
console.log(Object.keys(obj)); // [ "a" ]
podemos entender que Object.keys nos retorna un array con los keys que contiene el objeto que recibe por parámetro. A su vez, un objeto puede poseer propiedades pero éstas estar definidas para que no sean enumerables. Una propiedad no-enumerable no es recorrida con loops for...in
y no es considerada por Object.keys
. La forma de definir propiedades no-enumerables es con Object.defineProperty. Se puede saber también si una propiedad es enumerable usando Object.prototype.propertyIsEnumerable, por ejemplo:
console.log(Object.keys(Math)); // []
console.log(Math.propertyIsEnumerable('random')); // false
console.log(Object.getOwnPropertyNames(Math)); // ["E", "LN10", "LN2", "LOG2E", "LOG10E", "PI", "SQRT1_2", "SQRT2", "random", "abs", "acos", "asin", "atan", "ceil", "cos", "exp", "floor", "log", "round", "sin", "sqrt", "tan", "atan2", "pow", "max", "min", "imul", "sign", "trunc", "sinh", "cosh", "tanh", "asinh", "acosh", "atanh", "log10", "log2", "hypot", "fround", "clz32", "cbrt", "log1p", "expm1"]
Por lo tanto, si queremos obtener todas las propiedades de un objeto, ya sean enumerables o no, debemos utilizar Object.getOwnPropertyNames. Si lo aplicamos a un array vacío:
console.log(Object.getOwnPropertyNames([])); // ["length"]
console.log([].forEach); // function forEach() { [native code] }
Entonces, ¿dónde reside la función forEach? ¿Cuando se setea en el array vacío?¿Pertenece realmente al array vacío?