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

时间:2018-04-02 17:39:26

标签: javascript ecmascript-6 symbols

javascript(ECMASCRIPT6)中符号的用途是什么?

为什么以下示例返回false?

const symbol1 = Symbol();

console.log(Symbol('foo') === Symbol('foo'));
// expected output: false

3 个答案:

答案 0 :(得分:6)

来自the documentation

  

{{1}}返回的每个符号值都是唯一的。

这意味着{{1}}比较将失败,因为它们不是相同的

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

答案 1 :(得分:4)

Symbol用于创建完全唯一的,独一无二的标识符。它的使用正是您列出的例子。

即使您使用相同的字符串调用Symbol,实例也会有所不同。这允许不同的库(可以同时使用)来定义可以同时使用的密钥。

例如,假设两个库使用通用名称来定义windowglobal上的内容(或者为了说明,假全局door):



const door = {};
// from library 1
door.cake = () => console.log('chocolate');
// from library 2
door.cake = () => console.log('vanilla');

// your code
door.cake();




在此示例中,第一个库代码丢失,因为它无意中被赋予与第一个库相同的名称。

现在,如果它们都使用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]();




两者仍可访问。

这有点过于简单化了,但它说明了这一点。

在更实际的用法中,这些用于导入模块等内容。模块最终可能会使用相同的名称,但这样可以,因为它们具有与之关联的唯一符号,只要您拥有Symbol个对象,就可以使它们唯一可访问。

至于何时自己使用它们......它可能会非常罕见。只要您有办法提供Symbol但需要其他东西保持独特,您主要想要使用它们。我只是在一些狭窄的情况下直接使用这些,其中创建的元素可能最终相同。

例如,如果您使用名称作为键来创建对象,则可能具有重复的名称。没有符号,对象将覆盖另一个。有了符号,他们都会留下来。



const people = {};
people[Symbol('bob')] = { name: 'Bob Smith' };
people[Symbol('bob')] = { name: 'Bob Jones' };




答案 2 :(得分:1)

符号的想法是将私有属性引入Javascript。但是,它的实际目的是名称冲突。

然而不幸的是,他们最终被严重降级,毕竟不是私人的,因为你可以通过反思找到它们。具体来说,通过Object.getOwnPropertySymbols方法并通过代理。

Symbol()返回的每个符号值都是唯一的。符号值可以用作对象属性的标识符;这是数据类型的唯一目的。 (根据mozilla)

var Pet = (function() {
  var typeSymbol = Symbol('type');
  function Pet(type) {
    this[typeSymbol] = type;
  }
  Pet.prototype.getType = function(){
    return this[typeSymbol];
  }
  return Pet;
}());

var a = new Pet('dog');
console.log(a.getType()); // prints dog
a[Object.getOwnPropertySymbols(a)[0]] = "cat"
console.log(a.getType()); //prints cat