Digamos, tengo una matriz con índices no numéricos:
let arr = [12] arr["fruit"] = "apple" arr["off"] = falsefor..of no ve índices no numéricos: for (let item of arr) { console.log(item) }• Producción:
12
let iterator = arr[Symbol.iterator]() let { value, done } = iterator.next() while (!done) { console.log(value); ({ value, done } = iterator.next()) }• Producción:
12
Object.keys() ve índices no numéricos: for (let key of Object.keys(arr)) { console.log(`key: ${key}`) }• Producción:
clave: 0 clave: fruta tecla: apagado
Object.values() ve valores de todos los índices: for (let value of Object.values(arr)) { console.log(`value: ${value}`) }• Producción:
valor: 12 valor: manzana valor: falso
Object.entries() ve todas las entradas: for (let [key, value] of Object.entries(arr)) { console.log(`key = ${key}, value = ${value}`) }• Producción:
clave = 0, valor = 12 clave = fruta, valor = manzana clave = desactivado, valor = falso
Object.getOwnPropertyNames() también ve todos los índices no numéricos: for (let prop of Object.getOwnPropertyNames(arr)) { console.log(prop) }• Producción:
0 longitud Fruta apagado
let descr descr = Object.getOwnPropertyDescriptor(arr, "fruit") console.log(descr) descr = Object.getOwnPropertyDescriptor(arr, "off") console.log(descr)• Producción
{
valor: 'manzana',
escribible: cierto,
enumerable: cierto,
configurable: verdadero
}
{
valor: falso,
escribible: cierto,
enumerable: cierto,
configurable: verdadero
}
Cuando usa lo que está describiendo como índices "no numéricos" con una matriz, está equivocado en cuanto a lo que está haciendo.
let arr = [12]; // Set a variable equal to an array with only the number 12 in it arr["fruit"] = "apple"; // Add a new custom property to your instance of an Array arr["off"] = false // Add a new custom property to your instance of an Array console.log(arr[0]); // 12 // Notice how the next 3 lines access properties of the Array, not indexed values? console.log(arr.fruit); // "apple" console.log(arr.off); // false console.log(arr.length) // There is only 1 array item, but 2 additional properties Las matrices solo tienen índices numéricos, pero son objetos, por lo que también tienen propiedades. Por ejemplo, la propiedad Array.length no es algo que aparezca cuando recorres los índices.
Entonces, cuando dice: "Object.getOwnPropertyNames() también ve todos los índices no numéricos", bueno, no, no lo hace. Como indica el nombre del método, obtiene todos los nombres de propiedades que se han agregado a esa instancia única del objeto, no los índices. Index != Property .
Si desea que los nombres vayan con los valores, debe usar Object , que tiene "claves", que pueden ser cualquier valor de cadena.