Moh*_*nda 3 javascript symbols ecmascript-6
在javascript(ECMASCRIPT6)中使用Symbol有什么用?
为什么以下示例返回false?
const symbol1 = Symbol();
console.log(Symbol('foo') === Symbol('foo'));
// expected output: false
sam*_*ime 11
Symbol用于创建一个完全唯一的、独一无二的标识符。它的用途正是用于您列出的示例。
即使您Symbol使用相同的字符串调用,实例也会有所不同。这允许不同的库(可以同时使用)定义可以同时使用的键。
例如,想象两个库使用一个通用名称来定义window或global(或为了说明,假的 global door):
const door = {};
// from library 1
door.cake = () => console.log('chocolate');
// from library 2
door.cake = () => console.log('vanilla');
// your code
door.cake();Run Code Online (Sandbox Code Playgroud)
在这个例子中,第一个库代码丢失了,因为它无意中被赋予了与第一个相同的名称。
现在,如果它们都使用Symbol,那么即使它们的名称相同,您仍然可以访问两者(假设它们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]();Run Code Online (Sandbox Code Playgroud)
两者仍然可以访问。
这有点过于简单化,但它说明了这一点。
在更实际的用法中,这些用于诸如导入模块之类的事情。模块可能会以相同的名称结束,但这没关系,因为它们将具有与之关联的唯一符号,只要您拥有Symbol对象,就可以唯一地访问它们。
至于什么时候自己使用它们......它可能会非常罕见。您主要希望在有办法提供Symbol但需要其他东西以保持独特性的任何时候使用它们。我只在创建的元素可能最终相同的少数情况下直接使用这些。
例如,如果您使用名称作为键来创建对象,则可能会有重复的名称。如果没有符号,对象将相互覆盖。有了符号,它们都会留下来。
const people = {};
people[Symbol('bob')] = { name: 'Bob Smith' };
people[Symbol('bob')] = { name: 'Bob Jones' };Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
602 次 |
| 最近记录: |