2015-10-23 5 views
6

Ho visto questo alcune volte in alcuni esempi di nodi ma non sono mai abbastanza sicuro di cosa farne. Un esempio è con un net.Socket. Ecco un socket dopo che è stato emesso un avviso dai listener di dati.Qual è questa struttura di dati che appare come una lista, ma ha coppie di valori chiave?

> commands._events.data 
[ [Function], warned: true ]; 

Un altro esempio è nell'uso /^(some)(regex)$/.exec("someregex")

[ 'someregex', 
    'some', 
    'regex', 
    index: 0, 
    input: 'someregex' ] 

io non sono sicuro di aver capito quello che questa struttura dati è. È una lista o un dizionario? Perché ha indici e anche coppie di valori chiave? Posso fare match.index, ma anche match[1]. Come è costruito?

(scusate se si tratta di un dupe, non è stato trovato in google).

risposta

4

È un array, ma con proprietà aggiuntive. L'esempio con l'espressione regolare può essere spiegato da the specification for exec - vedere i punti 13 e 15, per esempio, dove si crea una matrice, quindi aggiunge la proprietà index:

  1. Sia A un nuovo array creato come se dall'espressione new Array() dove Array è il costruttore built-in standard con quel nome.
  2. Sia matchIndex essere i.
  3. Chiama il metodo interno [[DefineOwnProperty]] di A con argomenti "index", Property Descriptor {[[Value]]: matchIndex, [[Writable]: true, [[Enumerable]]: true, [[Configurable] ]: vero} e vero.

(A è il valore di eventuale ritorno)

Si può fare lo stesso:

var x = [1, 2, 3]; 
x['abc'] = 5; 
console.log(x);  //[1, 2, 3, abc: 5] 
console.log(x.length); //3 
console.log(x[1]);  //2 
console.log(x.abc); //5 
+0

Vedo, questo ha senso, non sapevo nemmeno che potessi farlo. Grazie per la risposta – corvid

+0

Vale la pena notare che l'output di 'console.log (x);' dipende dal browser. Ad esempio, in Safari su Mac OS X, restituisce '[1, 2, 3]'. –

+0

@EdCottrell Ok. (In Chrome) se metti semplicemente 'x' sulla console, stampa anche solo' [1, 2, 3] '- hai bisogno di' console.log' per ottenere le proprietà aggiuntive. –

1

In JavaScript tutto ciò che non è un primitivo è un oggetto.

Gli array sono anche oggetti in JavaScript. Hanno funzioni e proprietà speciali che li fanno comportare come una raccolta ma tutte le regole degli oggetti si applicano ancora a loro.

Problemi correlati