Array es solo un tipo especial de objeto en JS. Hay una sintaxis especial, que es buena, porque nos permite trabajar con ellos de forma eficaz. Imagínese lo tedioso que sería escribir un literal de matriz de esa manera:
const array = {0: 'foo', 1: 'bar', 2: 'baz'}
Sin embargo, siguen siendo objetos . Entonces, si lo hace:
const myArray = [42, 'foo', 'bar', 'baz'];
myArray[-1] = 'I am not here';
myArray['whatever'] = 'Hello World';
Esas propiedades que no son enteras se adjuntarán a un objeto (qué matriz es), pero algunos métodos nativos como Array.length.
Puede asumir que el método nativo de 'longitud' es un captador que cuenta todas las propiedades (y los índices son propiedades, mientras que los valores son los valores reales ) convertibles en números enteros positivos o cero. Algo como esta pseudo-implementación:
Debido a las especificaciones , el lengthmétodo nativo , como getter ( exampleArray.length), verificará todas las claves ' enteros no negativos menores de 2 32 ', obtendrá la mayor y devolverá su valor numérico + 1.
Como setter ( exampleArray.length = 42), creará algunos espacios vacíos para los índices 'perdidos' si la longitud dada es mayor que el número real de claves enteras no negativas, o eliminará todas las claves enteras no negativas (y sus valores) que no sean mayores que el longitud dada.
La pseudo-implementación:
const myArray = {
'-1': 'I am not here',
0: 42,
1: 'foo',
2: 'bar',
3: 'baz',
whatever: 'Hello World',
get myLength() {
let highestIndex = -1;
for (let key in this) {
let toInt = parseInt(key, 10);
if (!Number.isNaN(toInt) && toInt > -1) {
if (toInt > highestIndex) highestIndex = toInt;
}
}
return highestIndex + 1;
},
set myLength(newLength) {
}
}
console.log(myArray.myLength);
myArray[9] = 'foobar';
console.log(myArray.myLength);