我知道符号已被添加到ES2015,但没有读到太多关于它们的信息。我现在做了一些阅读,他们的目的显然不是我想的。似乎预期的目的是提供一种创建私有属性的方法。我的理解是,它类似于某些函数语言中的原子,它被备份here。我觉得奇怪的是它完全没有提到我错误地认为是他们的主要原因,这是为了提供一个更有意义的替代字符串进行模式匹配:
export const FOO = 'This value is irrelevant as long as its unique';
// or
export const FOO = Symbol('A sensible description of what foo represents');
switch(blah):
case FOO: do_something();
...
在上述情况下,使用Symbol似乎有许多优点,因为它可以防止意外碰撞(即使两个常量等于相同的字符串),从而消除了每次出现一个唯一字符串的负担并提供了向任何阅读有关其预期目的的代码的人明确指示。最后的考虑在某种程度上依赖于其他人同意我对符号应该用于什么的解释。
无论如何,问题是,这是符号的一个很好的用例,如果不是,为什么不呢?
答案 0 :(得分:5)
似乎预期的目的是提供一种创建私有属性的方法。
不,一点也不。非常非常早,这是一个激励因素,但在规范完成之前很久就被丢弃了。如果它们旨在提供某种隐私,我们就不会Object.getOwnPropertySymbols
。
私人实例信息有着漫长而折磨的道路,并且仍在蜿蜒前行;目前它是Class Fields proposal的一部分(以前是它自己的东西)。
无论如何,问题是,这是符号的一个很好的用例,如果不是,为什么不呢?
是。 Symbol的主要目的之一是提供唯一的标识符而不会发生冲突。
原始值,表示唯一的非String对象属性键
每个可能的Symbol值都是唯一且不可变的。
虽然没有动机,但它是指示性的。