更新:最近一篇来自Mozilla的精彩文章出现了.如果你好奇,请阅读它.
您可能知道他们计划在ECMAScript 6中包含新的Symbol原语类型(更不用说其他一些疯狂的东西).我一直认为:symbol
Ruby 中的概念是不必要的; 我们可以轻松地使用纯字符串,就像我们在JavaScript中一样.现在他们决定用JS复杂化JS.
我不明白动机.有人可以向我解释我们是否真的需要JavaScript中的符号吗?
我只是偶然在JavaScript中,新的(建议ES6,但在Firefox,Chrome和歌剧已经实施)数据类型的文档时Symbol
:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol http://people.mozilla.org/~jorendorff/es6-draft.html#sec-symbol-objects
我正在读它,但我想不出可能的使用场景.
文件说:
符号是唯一且不可变的数据类型,可用作对象属性的标识符.
好的,好吧,假设我按照文档说的那样做:
obj[Symbol("a")] = "a";
Run Code Online (Sandbox Code Playgroud)
但是,因为符号('a')总是返回唯一值(对象),并且:
迭代中的符号在...中不可见.
我如何从中检索我的财产obj
?
var obj = { normalProperty: 'just a string' };
obj[Symbol('a')] = 'a';
document.getElementById('retrieve').addEventListener('click', function() {
document.write('Stringified object:' + JSON.stringify(obj) + '<br/><br/>');
document.write('Trying to get Symbol-property value, aaaand...: <br/>');
document.write(obj[Symbol('a')]); // undefined
}, false);
Run Code Online (Sandbox Code Playgroud)
<button id="retrieve">Retrieve obj's property</button>
Run Code Online (Sandbox Code Playgroud)
当然,您可以像这样检索它:
var x = Symbol('a');
obj[x] = 'a';
obj[x]; // "a"
Run Code Online (Sandbox Code Playgroud)
但这样做的目的是什么?
提前致谢 :)
ECMA-262-v6中"符号"类型的含义是什么?对象键的快速路径实现?它在引擎盖下做了什么 - 哈希它保证底层数据是不可变的?