Perché JavaScript calcola la lunghezza dell'array per l'ultimo indice?

3

JavaScript sembra calcolare la proprietà della lunghezza dell'array per il numero dell'ultimo indice dell'array invece di contare il numero di elementi nell'array. Esempio:

var testArray = ['a', 'b', 'c'];
console.log(testArray.length); //3
testArray[8] = 'i';
console.log(testArray.length); //9

Normalmente userei push () e non aggiungerei un valore a un array usando la notazione delle parentesi, ma questa fu una sorpresa. C'è qualche ragione per questa implementazione dell'assegnazione di un valore a Array.length? L'unica cosa che posso sembrare è che utilizza solo l'ultimo indice come ottimizzazione delle prestazioni per evitare il conteggio degli elementi dell'array.

    
posta VirtuosiMedia 07.04.2013 - 13:58
fonte

2 risposte

8

La lunghezza di un array è il numero di elementi in esso contenuti per cui non importa se questi elementi sono oggetti o valori validi o semplicemente "non definiti". Se aggiungi un elemento nella posizione 8, generi automaticamente 5 elementi aggiuntivi tra i tuoi primi tre elementi e quello nuovo, come puoi vedere se corri

for(var i = 0; i < testArray.length; i++){console.log(testArray[i]);}

(Quelli possono o non possono prendere spazio reale nella memoria, a seconda dell'implementazione reale)

Essere "equaly spaced" è in qualche modo la definizione di un array (rispetto ad altri tipi di contenitori come liste o dizionari).

    
risposta data 07.04.2013 - 14:16
fonte
2

Penso piuttosto che sia il contrario: l'ultimo indice è basato sulla lunghezza. Penso che JS potrebbe semplicemente impostare la lunghezza per te dietro le quinte quando assegni un valore a un (ancora) indice non esistente. Il che significa che puoi leggere il tuo:

testArray[8] = 'h';

come

SetLength(testArray, 9); // or something similar (I'm not too familiar with JS)
testArray[8] = 'h';

Ci sono alcuni linguaggi là fuori che consentono gli array con altri indici di partenza, ma la maggior parte degli array che consentono l'allocazione / dimensionamento dinamico avrà indici basati su zero. Ciò significa che esiste sempre una relazione fissa tra la lunghezza dell'array e l'ultimo numero di indice:

Last index number = Length - 1

Aggiorna

JS non esegue un last index + 1 per ottenere il conteggio. Quando fai testArray[8] = 'h'; JS non imposta semplicemente la lunghezza a 8 + 1 . Prima controlla quanti elementi ci sono già nell'array. Quando l'array non dispone ancora di elementi sufficienti per archiviare qualcosa nell'indice 8, verrà ridimensionato. Ridimensiona l'array in modo che sia abbastanza grande da contenere qualcosa nell'indice 8, che, poiché gli array sono basati su zero, significa ridimensionamento su 8 + 1.

Lunghezza < > numero di elementi memorizzati

Questo non significa che l'array contenga 9 elementi. Significa solo che l'array ha spazio sufficiente per farlo. Se crei un array solo per testArray[8] = 'h'; , stai essenzialmente dicendo a JS di allocare spazio sufficiente per 9 elementi e di memorizzare 'h' sull'elemento con indice 8.

    
risposta data 07.04.2013 - 14:13
fonte

Leggi altre domande sui tag