Gli array Javascript sono sparsi?

Cioè, se uso l’ora corrente come indice nell’array:

array[Date.getTime()] = value; 

l’interprete farà istanziare tutti gli elementi da 0 a adesso? I diversi browser lo fanno diversamente?

Ricordo che c’era un bug nel kernel AIX , che creava pseudo-tty su richiesta, ma se facessi, ad esempio, “echo> / dev / pty10000000000” creerebbe / dev / pty0, / dev / pty1, …. e poi cadi morto. È stato divertente alle fiere, ma non voglio che succeda ai miei clienti.

Il modo in cui vengono implementati esattamente gli array di JavaScript differisce da browser a browser, ma generalmente ricadono su un’implementazione sparsa, molto probabilmente la stessa utilizzata per l’accesso alle proprietà di oggetti regolari, se l’utilizzo di un array effettivo sarebbe inefficiente.

Dovrai chiedere a qualcuno con una maggiore conoscenza di implementazioni specifiche per rispondere a ciò che innesca sconsideratamente il passaggio da denso a scarso, ma il tuo esempio dovrebbe essere perfettamente sicuro. Se si desidera ottenere una matrice densa, è necessario chiamare il costruttore con un argomento di lunghezza esplicita e sperare che ne riceverai effettivamente uno.

Vedi questa risposta per una descrizione più dettagliata di olliej.

Sì. In realtà sono tabelle hash internamente, quindi è ansible utilizzare non solo interi di grandi dimensioni ma anche stringhe, float o altri oggetti. Tutti i tasti vengono convertiti in stringhe tramite toString() prima di essere aggiunti all’hash. Puoi confermarlo con un codice di prova:

  

Displays:

 array[0] = zero, typeof(0) == string array[1254503972355] = now, typeof(1254503972355) == string array[3.14] = pi, typeof(3.14) == string 

Nota come ho usato for...in syntax, che ti dà solo gli indici che sono effettivamente definiti. Se si utilizza il più comune stile di iterazione for (var i = 0; i < array.length; ++i) , si avranno ovviamente problemi con indici di array non standard.

È ansible evitare il problema utilizzando una syntax javascript progettata per questo genere di cose. Puoi trattarlo come un dizionario, ma la syntax “per … in …” ti permetterà di afferrarli tutti.

 var sparse = {}; // not [] sparse["whatever"] = "something"; 

Gli oggetti Javascript sono sparsi e gli array sono solo oggetti specializzati con una proprietà di lunghezza mantenuta automaticamente (che in realtà è più grande dell’indice più grande, non il numero di elementi definiti) e alcuni metodi aggiuntivi. Sei sicuro in entrambi i casi; usa un array se ti servono le sue funzioni extra e un object altrimenti.