关于“不重复”的注释:
有人告诉我这是重复的javascript ECMAScript 6 中的 Symbol 有什么用?。嗯,这对我来说似乎不太合适。他们给出的代码是这样的:
const door = {};
// library 1
const cake1 = Symbol('cake');
door[cake1] = () => console.log('chocolate');
// library 2
const cake2 = Symbol('cake');
door[cake2] = () => console.log('vanilla');
// your code
door[cake1]();
door[cake2]();
唯一使这项工作成功的是因为cake1
and cake2
是不同的(唯一的)名称。但开发商已经明确给出了这些;没有提供任何东西Symbol
这在这里有帮助。
例如,如果你改变cake1
and cake2
to cake
然后运行,会报错:
未捕获的语法错误:标识符“蛋糕”已被声明
如果您已经必须手动提出唯一标识符,那么该怎么办Symbol
帮助?
如果您在控制台中执行此操作:
Symbol('cake') === Symbol('cake');
它评估为false
。所以它们是独一无二的。但为了实际使用它们,您现在必须想出 2 个键名(cake1
and cake2
)是独一无二的。这必须由开发人员手动完成;里面什么都没有Symbol
或一般的 JavaScript 会对此有所帮助。您基本上是使用创建一个唯一标识符Symbol
但随后必须手动将其分配给...您作为开发人员必须想出的唯一标识符。
关于链接的帖子,他们引用了这个例子不使用Symbol
:
const door = {};
// from library 1
door.cake = () => console.log('chocolate');
// from library 2
door.cake = () => console.log('vanilla');
// your code
door.cake();
他们试图声称这是一个问题并且只会记录“vanilla”。很明显那是因为door.cake
不是唯一的(它被声明了两次)。 “修复”就像使用一样简单cake1
and cake2
:
door.cake1 = () => console.log('chocolate');
door.cake2 = () => console.log('vanilla');
door.cake1(); // Outputs "chocolate"
door.cake2(); // Outputs "vanilla"
现在可以工作并记录“巧克力”和“香草”。在这种情况下Symbol
根本没有使用过,而且确实与该工作没有任何影响。这只是开发人员分配了唯一标识符的情况,但他们是手动完成的,并且没有使用Symbol
.
原问题:
我正在学习 JavaScript 课程,演讲者正在讨论Symbol
.
他在视频的开头说道:
Symbol 的特点是每一个都是unique这使得他们在对象属性标识符等方面非常有价值.
然而他接着说:
- 它们是不可枚举的
for...in
loops.
- 它们不能用于
JSON.stringify
。 (它会产生一个空对象)。
对于第(2)点,他给出了这个例子:
console.log(JSON.stringify({key: 'prop'})); // object without Symbol
console.log(JSON.stringify({Symbol('sym1'): 'prop'})); // object using Symbol
这个日志{"key": "prop"}
and {}
分别到控制台。
这如何使Symbol
就唯一对象键或标识符而言“有价值”?
根据我的经验,您想要对对象执行的两件非常常见的事情是枚举它,或者将其中的数据转换为 JSON 以通过 ajax 或某种此类方法发送。
我不明白这样做的目的是什么Symbol
是的,但特别是为什么你想使用它们来制作对象标识符?鉴于它会导致以后发生你无法做的事情。
编辑 - 以下是原始问题的一部分 - 但与实际目的相比是一个小问题Symbol
关于唯一标识符:
如果您需要发送类似的内容{Symbol('sym1'): 'prop'}
通过 ajax 到后端在这种情况下你实际上需要做什么?