在JavaScript ECMAScript 6中使用Symbol有什么用?

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使用相同的字符串调用,实例也会有所不同。这允许不同的库(可以同时使用)定义可以同时使用的键。

例如,想象两个库使用一个通用名称来定义windowglobal(或为了说明,假的 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)


tad*_*man 6

文档:

返回的每个符号值Symbol()都是唯一的.

这意味着===比较将失败,因为它们不相同.

如果你想要一种可以给出描述性的唯一标识符,如果不相关的名称,那么Symbol可能是有用的.