2013-07-08 4 views
6

Я играю с символами ECMAScript 6 и картами в Node.JS v0.11.4 с флагом --harmony. Рассмотрим следующее.Восстановить ключ/значение свойства

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

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

Может ли значение 'Noise' извлекаться учитывая свойство идентифицируется «анонимный» символ ключа, который гарантированно быть уникальным?

+0

я не знаю об утечке, но вы не можете вернуться к значению без ref to the Symbol() return ... – dandavis

+1

Я понятия не имею, как работают символы ES ​​6, но не можете ли вы перечислить объект? 'для (var key in a) alert (a [ключ]);' – jods

ответ

5

Это невозможно сделать в node.js, потому что текущая версия v8 не реализовала итерацию, как указано в этом bug report.

Мы можем подтвердить, что, посмотрев на исходный код v8-х collection.js:

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

Но, как можно видеть в ECMAScript 6 wiki, также должны быть items(), keys() и values(). v8, вероятно, раньше не применял эти методы, поскольку он не поддерживал генераторы. Но теперь it does с мая этого года. Это должно быть просто вопросом времени, пока это не будет реализовано.

Если у вас должна быть эта функция сейчас, вы можете использовать map-set-for-each, который заполняет forEach. Вам необходимо будет изменить его, чтобы добавить case 'symbol': после case 'object':.

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

Когда v8 реализует итерацию Map вы сможете найти Noise так:

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