2013-07-08 10 views
6

Ich spiele mit ECMAScript 6 Symbole und Karten in Node.JS v0.11.4 mit dem --harmony Flag. Folgendes berücksichtigen.Recover Eigenschaft Schlüssel/Wert

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

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

Kann 'Noise' der Wert abgerufen Eigentum gegeben wird durch einen „anonymen“ Symbol Schlüssel identifiziert, die eindeutig sein wird gewährleistet?

+0

ich weiß nicht, über ein Leck, aber man kann nicht zurück auf den Wert ohne eine bekommen ref auf das Symbol() return ... – dandavis

+1

Ich habe keine Ahnung, wie ES 6 Symbole funktionieren, aber können Sie das Objekt nicht aufzählen? 'für (var key in a) Warnung (a [Schlüssel]);' – jods

Antwort

5

Es ist nicht möglich, dies in node.js zu tun, da die aktuelle Version von v8 keine Iteration implementiert hat, wie in dieser bug report angegeben.

Wir können das bestätigen, indem auf den Quellcode von v8 sucht collection.js:

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

Aber, wie in ECMAScript 6 wiki zu sehen ist, sollte es auch items(), keys() und values() sein. v8 hat diese Methoden wahrscheinlich noch nicht implementiert, da Generatoren nicht unterstützt wurden. Aber jetzt it does seit Mai dieses Jahres. Es sollte nur eine Frage der Zeit sein, bis dies umgesetzt wird.

Wenn Sie diese Funktionalität jetzt benötigen, können Sie map-set-for-each verwenden, die Polyfills forEach. Sie müssen es ändern, um case 'symbol': nach case 'object': hinzuzufügen.

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

Wenn v8 Iteration von Map implementiert werden Sie in der Lage sein Noise wie folgt zu finden:

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