Uso della nuova dichiarazione di array (n) JavaScript

Domanda JavaScript di base: Poiché non esiste un limite rigido per gli array come nel caso di Java (ad esempio IndexOutOfBoundsException ), a cosa serve la dichiarazione in cui viene specificata la proprietà length?

var a = new Array(10); 

So che predefinisce la lunghezza e pone “indefinito” in quei punti vuoti. Questa è una ragione sufficiente per averlo?

Ci sono molti benefici percepiti nel dichiarare una dimensione dell’array, ma penso che la maggior parte dei benefici percepiti siano solo il FUD.

Migliori prestazioni! / È più veloce!

Per quanto posso dire la differenza tra la pre-allocazione e l’allocazione dynamic è trascurabile.

Più interessante, la specifica non afferma che l’array debba essere impostato su una lunghezza pre-allocata!

Dalla sezione 15.4.2.2 ECMA-262 :

Se l’argomento len è un numero e ToUint32 ( len ) è uguale a len , la proprietà length dell’object di nuova costruzione viene impostata su ToUint32 ( len ). Se l’argomento len è un numero e ToUint32 ( len ) non è uguale a len , viene generata un’eccezione RangeError .

Un caso di prova non scientifico per-divertimento è qui: http://jsbin.com/izini

Rende il codice più comprensibile!

Personalmente, non sono d’accordo.

Considera il javascript che hai scritto in passato e prendi in considerazione il codice che potresti dover scrivere in futuro. Non riesco a pensare a una singola volta in cui ho bisogno di specificare un limite statico su uno dei miei array. Direi anche che i potenziali problemi di limitare gli array in javascript superano di gran lunga i benefici causati dal fatto di far sapere alle persone cosa stavi pensando senza alcun controllo effettivo dietro di esso. Diamo peso ai pro e ai contro …

Professionisti:

  1. Sarà più facile per loro capire che cosa intendi fare il codice.
  2. Saranno in grado di trovare i bug causati dalla tua ipotesi più tardi (lingua con fermezza sulla guancia)

Contro:

  1. Sguardi veloci possono facilmente confondere “new Array (10)” con “new Array (’10 ‘)” che fanno cose completamente diverse!
  2. Si impone un limite arbitrario al codice senza limiti di lunghezza normali, causando la scrittura di molti codici della piastra per controllare e mantenere il limite.
  3. Stai imponendo un limite arbitrario al codice che potrebbe probabilmente essere stato generalizzato per funzionare con qualsiasi lunghezza di valori.
  4. Stai facendo un’ipotesi su come le persone leggeranno il tuo codice assumendo che l’alternativa sarebbe meno confusa.

Puoi anche aver scritto:

 //I assume this array will always be length 10 var arr = new Array(); 

Nel caso precedente il commento potrebbe anche essere preferibile. La dichiarazione esplicita di intenti può evitare qualsiasi confusione non utilizzata per utilizzare il costruttore come dichiarazione di intenti.

Bene, allora … perché pensi che sia anche lì allora?

Convenienza. Quando stavano scrivendo le specifiche penso che abbiano realizzato due cose.

  1. Questo tipo di incarico sarebbe qualcosa a cui gli sviluppatori provenienti da linguaggi simili sarebbero abituati.
  2. Implementazioni di ECMAScript potrebbero potenzialmente utilizzarlo per migliorare le prestazioni.

Quindi lo hanno messo lì. La specifica definisce solo l’uso del parametro, non come dovrebbe essere implementato.

Prestazioni sul motore JavaScript V8.

Facendo:

 var arr = []; arr.length = 1000; 

V8 prealloca la memoria richiesta per l’array e mantiene / imposta la Hidden Class dell’array per compattare l’array SMI (Small Int, 31 bit unsigned). Tuttavia, questo non è vero quando la lunghezza desiderata è troppo grande, il che comporta che l’HC sia impostato su array sparse (cioè mappa).

Prova il seguente link su Chrome: http://jsperf.com/0-fill-n-size-array

Ho incluso un test case extra senza la definizione della lunghezza dell’array in modo da poter indicare la reale differenza di prestazioni.

Informazioni correlate: http://www.youtube.com/watch?v=UJPdhx5zTaw

Non sono sicuro, ma scommetterei che allocasse la memoria in modo diverso a un livello basso. Se sai che stai creando 10.000 elementi, devi solo riservare molto spazio invece di ridimensionarlo dynamicmente sullo sfondo in qualsiasi momento.

Chiarezza.

Quando scrivi il codice, il tuo objective non è tanto capire il computer da parte del computer, ma il programmatore successivo che legge il tuo codice per capirti.

 var xs = new Array(10); 

Il codice sopra mostra la tua intenzione : avere un array di 10 elementi.

 var xs = []; 

Quanto sopra non dà nulla; nessuna informazione extra.

Saluti.

Ho creato questo JSPerf che dimostra il problema, incluse le varie versioni. Gli argomenti che trovo sono tali:

  1. L’utilizzo della nuova matrice () può comportarsi in modo imprevisto, può essere ignorato
  2. L’impostazione .length in realtà non aumenta le dimensioni dell’array in alcuni browser
  3. Il successo della performance non è davvero lì.

Penso che questi test dovrebbero mettere a tacere quegli argomenti, ma va notato che i diversi browser trattano questo problema in modo molto diverso. Firefox sembra ottimizzare e capire quanto grande sarà la matrice, mentre Chrome assegna la memoria come ci si aspetterebbe. E, come al solito, Internet Explorer fa schifo all’attività.

Supponiamo di volere un array di una certa lunghezza inizializzato su un certo valore. Questo non funzionerà:

 scores = [].fill(0.0, 0, studentCount); 

Ti fornirà solo un array vuoto, perché fill () non estenderà mai l’array oltre la sua lunghezza originale.

Questo funzionerà:

 scores = new Array(studentCount).fill(0.0, 0, studentCount); 

Ti fornirà una serie di valori di studentiCount inizializzati a zero.

Non è difficile mantenere la dimensione dell’array. Dai un’occhiata al seguente esempio:

 function updateArray(){ var a = [1,2,3,4,5,6,7,8,9,10]; //original array object var b = [11, 12, 13]; //New array object to be pushed a.splice(a.length-b.length, a.length); a.unshift.apply(a, b); return a; } 

a.unshift.apply(arg1, arg2) spinge il nuovo elemento in cima e a.push.apply(arg1, arg2) in fondo.

Beh, personalmente voglio una coda. Voglio che la coda sia lunga 10.

Il modo più semplice per farlo consiste nell’usare il metodo push array per mettere gli elementi alla fine della coda e il metodo shift() per metterli fuori dalla parte anteriore dell’array.

Il problema è, se voglio fare un semplice metodo “aggiungi” alla mia coda, e lo scrivo in questo modo:

 function addItemToArray(item, array){ array.shift(); array.push(item); return array; } 

allora non succede nulla di buono. Ciò che è meglio (in realtà, ciò che funzionerà) è dichiarare il mio array in questo modo:

 var maxSizeIsTen = new Array(10); 

e poi usarlo ovunque. Inoltre, si noti il ​​”buon” modo di descrivere l’array – nessun commento che nessuno legge, e chiunque usi questo codice risolverà in breve tempo la dimensione massima di questo array.

SÌÌ!