2013-07-08 11 views
6

Sto giocando con i simboli e le mappe ECMAScript 6 in Node.JS v0.11.4 con il flag --harmony. Considera quanto segue.Recupera chiave/valore proprietà

var a = Map(); 
a.set(Symbol(), 'Noise'); 

// Prints "1" 
console.log(a.size); 

Può il valore 'Noise' essere recuperate data la proprietà è identificato da una chiave di simbolo "anonimo", che è garantito per essere unico?

+0

io non so di una perdita, ma non si può tornare al valore senza un ref to the Symbol() return ... – dandavis

+1

Non ho idea di come funzionano i simboli ES 6, ma non riesci a enumerare un oggetto? 'for (var key in a) alert (a [chiave]);' – jods

risposta

5

Non è possibile farlo in node.js perché la versione corrente di v8 non ha implementato l'iterazione come indicato in questo bug report.

Possiamo confermare che, cercando il codice sorgente del v8 di collection.js:

InstallFunctions($Map.prototype, DONT_ENUM, $Array(
    "get", MapGet, 
    "set", MapSet, 
    "has", MapHas, 
    "delete", MapDelete, 
    "clear", MapClear 
)); 

Ma, come si può vedere nella ECMAScript 6 wiki, ci dovrebbe essere anche items(), keys() e values(). Probabilmente il v8 non implementava questi metodi prima, perché non supportava i generatori. Ma ora it does dal maggio di quest'anno. Dovrebbe essere solo una questione di tempo prima che questo venga implementato.

Se è necessario disporre di questa funzionalità ora, è possibile utilizzare map-set-for-each quali polyfilling forEach. Sarà necessario modificarlo per aggiungere case 'symbol': dopo case 'object':.

a.forEach(function(value, key) { 
    if (value === 'Noise') { 
    console.log('Give mak the bounty'); 
    } 
}); 

Quando v8 implementa iterazione del Map si sarà in grado di trovare Noise come questo:

for (let [key, value] of a) { 
    if (value === 'Noise') { 
    console.log('Upvotes for future'); 
    } 
}