2014-05-12 11 views
5

Con mia grande sorpresa, questo codice funziona davvero in node.js:Gli array node.js sono in realtà delle hashmap?

var arr = new Array(); 
// also works: var arr = []; 
arr[0] = 123; 
arr['abc'] = 456; 
arr; // node.js: [ 123, abc: 456 ], chrome: [123] 

Ho sempre pensato che un array memorizza i propri oggetti in ordine, accessibile solo con una chiave intero, come uno std :: vector in C++. Tuttavia, qui si comporta come una mappa o un oggetto. Aggiungendo alla confusione, lo stesso codice funziona come previsto in chrome, restituendo un array con una singola voce, 123. Ho pensato che node.js e chrome javascript utilizzano lo stesso motore interno, V8. Cosa sta succedendo qui?

+0

No, sono in realtà array javascript, con un tipo di "oggetto"! – adeneo

+2

Mentre chrome non mostra '456' nella console,' arr.abc' sarà ancora '456'. Semplicemente non lo mostra nella console a meno che non si acceda esplicitamente alla variabile, o 'console.log (arr)', che registra: '[123, abc: 456]' Fondamentalmente, questo è solo un problema estetico. – Cerbrus

+0

Se è memorizzato in 'abc' non è in realtà una mappa hash. Solo un array chiave/valore. –

risposta

7

Javascript consente di estendere gli oggetti al volo e come Array è un oggetto che è possibile eseguire.

Quello che stai facendo è aggiungere una nuova proprietà all'array chiamato abc e assegnargli il valore 456.

Quindi si potrebbe dire che ogni oggetto in Javascript può essere usato come hashmap in qualche modo.

EDIT

Sembra che Chrome filtra le proprietà non numerici dell'oggetto Array a scarico mentre Nodo discariche ogni proprietà definita dall'utente. A mio parere il modo di nodo è migliore poiché la proprietà alfanumerica è disponibile in una dichiarazione for in:

var a = [1]; 
a['abc'] = 2; 
for (var i in a) { 
    console.log(i); 
} 
// Prints: 
// 0 
// abc 
+0

Sì, ogni oggetto può essere usato come hashmap, ma non è questo il problema. È solo un'incongruenza nella visualizzazione delle variabili. Ecco perché ho ripristinato la modifica, anche: questo "problema" è in effetti specifico per node.js – Cerbrus

+0

@Cerbrus A mio parere la chiave della domanda non è come viene visualizzata o meno da 'console.log()', ma il comportamento di matrici/oggetti come hashmap in Javascript. – Carlos

+0

Non stai ancora affrontando il fatto che il comportamento sembra essere diverso nel nodo rispetto al chrome, mentre in effetti gli oggetti contengono le stesse coppie chiave/valore. – Cerbrus

2

mentre Chrome non mostra 456 nella console quando è sufficiente inserire arr, arr.abc saranno ancora 456.

Semplicemente non lo mostra nella console a meno che non si acceda esplicitamente alla variabile, o console.log(arr), che registra: [123, abc: 456].

Fondamentalmente, questo è solo un problema estetico. Node.js mostra le proprietà chiave/valore sugli oggetti array quando si inserisce la variabile nella console, mentre chrome mostra solo le voci "normali" dell'array, anche se entrambi gli array hanno lo stesso contenuto.

+0

@Joel: risponde alla tua domanda o è ancora poco chiaro? – Cerbrus

5

Le risposte sono corrette, il comportamento è forse più comprensibile, se si tenta di visualizzare lunghezza della matrice.

var ar = [] 
ar[0] = 42 
console.log(ar.length) // 1 

ar[12] = 21 
console.log(ar.length) // 13 

ar['ab'] = 1 
console.log(ar.length) // 13 (separate property, not in array) 

ar[ar.length] = 33 
console.log(ar.length) // 14 

ar.push(55) 
console.log(ar.length) // 15 

console.log(ar) // display all items specified above 
//[ 42, , , , , , , , , , , , 21, 33, 55, ab: 1 ] 
// which in fact really is: 
// [ 42, , , , , , , , , , , , 21, 33, 55] as array and 
// special property of array object - 'ab':1 
Problemi correlati