Domanda

Cioè, se utilizzo l'ora corrente come indice nell'array:

array[Date.getTime()] = value;

l'interprete istanziarà tutti gli elementi da 0 ad oggi?I diversi browser lo fanno diversamente?

Ricordo che c'era un bug nel file AIX kernel, che creerebbe pseudo-tty su richiesta, ma se facessi, ad esempio, "echo > /dev/pty10000000000" creerebbe /dev/pty0, /dev/pty1, ....e poi cadere morto.È stato divertente alle fiere, ma non voglio che ciò accada ai miei clienti.

È stato utile?

Soluzione

Come funziona esattamente gli array JavaScript sono implementate differisce da browser a browser, ma in genere si dividono di nuovo ad un implementazione sparse - molto probabilmente lo stesso utilizzato per l'accesso a proprietà di oggetti normali -. Se si utilizza una matrice reale sarebbe inefficiente

Dovrete chiedere a qualcuno con più conoscenza circa le implementazioni specifiche per rispondere a ciò che fa scattare excatly il passaggio dal denso per scarsa, ma il tuo esempio dovrebbe essere perfettamente sicuro. Se si desidera ottenere una fitta, è necessario chiamare il costruttore con un argomento esplicito lunghezza e spero che troveremo a ottenere uno.

questa risposta per una descrizione più dettagliata da olliej.

Altri suggerimenti

Sì, lo sono. Essi sono in realtà tabelle hash internamente, in modo da poter utilizzare non solo le grandi numeri interi, ma anche corde, galleggianti, o altri oggetti. Tutti i tasti vengono convertiti in stringhe tramite toString() prima di essere aggiunto alla hash. È possibile confermare questo con un po 'di codice di prova:

<script>
  var array = [];
  array[0] = "zero";
  array[new Date().getTime()] = "now";
  array[3.14] = "pi";

  for (var i in array) {
      alert("array["+i+"] = " + array[i] + ", typeof("+i+") == " + typeof(i));
  }
</script>

Visualizza:

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

Si noti come ho usato la sintassi for...in, che vi dà solo gli indici che sono effettivamente definiti. Se si utilizza lo stile for (var i = 0; i < array.length; ++i) più comune di iterazione allora si avrà, ovviamente, avere problemi con gli indici degli array non standard.

Si potrebbe evitare il problema utilizzando una sintassi JavaScript progettato per questo genere di cose. È possibile trattarlo come un dizionario, ma la sintassi "for ... in ..." vi permetterà di afferrare tutti.

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

Gli oggetti Javascript sono sparsi e gli array sono solo oggetti specializzati con una proprietà di lunghezza gestita automaticamente (che in realtà è uno più grande dell'indice più grande, non il numero di elementi definiti) e alcuni metodi aggiuntivi.Sei al sicuro in ogni caso;usa un array se hai bisogno delle sue funzionalità extra e un oggetto altrimenti.

La risposta, come di solito è vero con JavaScript, è "è un po 'wierder ...."

L'utilizzo della memoria non è definito e qualsiasi implementazione è permesso di essere stupido. In teoria, potrebbe bruciare const a = []; a[1000000]=0; megabyte di memoria, come potrebbe const a = [];. In pratica, anche Microsoft evita quelle implementazioni.

Justin Amore sottolinea, l'attributo di lunghezza è la più alto set indice. Ma è solo aggiornati se l'indice è un numero intero.

Quindi, la matrice è scarsa. MA funzioni integrate come ridurre (), Math.max (), e "per ... di" camminerà attraverso l'intera gamma dei possibili indici interi formano 0 alla lunghezza, visitando molti che ritorno 'indefinito'. MA E 'per ... in' loop potrebbe fare come ci si aspetta, visitando solo i tasti definiti.

Ecco un esempio utilizzando Node.js:

"use strict";
const print = console.log;

let a = [0, 10];
// a[2] and a[3] skipped
a[4] = 40;
a[5] = undefined;  // which counts towards setting the length
a[31.4] = 'ten pi';  // doesn't count towards setting the length
a['pi'] = 3.14;
print(`a.length= :${a.length}:, a = :${a}:`);
print(`Math.max(...a) = :${Math.max(a)}: because of 'undefined values'`);
for (let v of a) print(`v of a; v=:${v}:`);
for (let i in a) print(`i in a; i=:${i}: a[i]=${a[i]}`);

dono:

a.length= :6:, a = :0,10,,,40,:
Math.max(...a) = :NaN: because of 'undefined values'
v of a; v=:0:
v of a; v=:10:
v of a; v=:undefined:
v of a; v=:undefined:
v of a; v=:40:
v of a; v=:undefined:
i in a; i=:0: a[i]=0
i in a; i=:1: a[i]=10
i in a; i=:4: a[i]=40
i in a; i=:5: a[i]=undefined
i in a; i=:31.4: a[i]=ten pi
i in a; i=:pi: a[i]=3.14

Ma. Ci sono più casi d'angolo con array non ancora citato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top