ECMA-262-v6中"符号"类型的含义是什么?

Pra*_*lva 6 javascript symbols ecmascript-6

ECMA-262-v6中"符号"类型的含义是什么?对象键的快速路径实现?它在引擎盖下做了什么 - 哈希它保证底层数据是不可变的?

ssu*_*ube 9

符号是替换魔术名称的私钥.它们阻止使用简单的字符串来引用字段,因此只有具有该符号的消费者才能获得访问权限.

一些符号用于指示运行时的特定行为(例如Symbol.iterator,其行为非常类似于预共享秘密),而其他符号可以由库分配并用于有效地隐藏字段.

通常,符号旨在替代魔法名称.您可以分配符号const foo = Symbol()并有选择地传递,而不是简单地称为'foo'的属性.这允许运行Symbol.iterator时在启动时进行分配,并保证尝试实现迭代的任何人都以一致的方式进行分配.

运行时可以使用符号来优化对某些字段的访问,如果它感觉需要,但不必.

您可以使用符号将消费者引导至特定方法,具体取决于其用法.例如,如果您有一个可以返回同步迭代或生成器的库,则根据客户端的异步支持,您可以:

const syncIterable = Symbol();
const asyncIterable = Symbol();

class Foo {
  static getIterable(async = false) {
    return async ? asyncIterable : syncIterable;
  }

  [syncIterable]() {
    return new SyncFoo();
  }

  [asyncIterable]() {
    return new AsyncFoo();
  }
}

let foo = new Foo();
for (let x of foo[Foo.getIterable(true)]()) {
  // could be a iterator, could be a generator
}
Run Code Online (Sandbox Code Playgroud)

这是一个相当人为的例子,但展示了图书馆如何使用符号有选择地提供对用户的访问.