Skip to content

Symbol

“Symbol” 值表示唯一的标识符。

js
// 标准创建
let id = Symbol();

// 添加  ( 描述 / Symbol名 )
let id2 = Symbol("id");

描述只是一个标签,但是他们不相等:

js
let id1 = Symbol("id");
let id2 = Symbol("id");

id1 == id2; // false

不会被 自动转换

大多数值 都 支持字符串的 隐式转换

但是 Symbol 不支持!

这是一种防止混乱的“语言保护”,因为字符串和 symbol 有本质上的不同,不应该意外地将它们转换成另一个。

js
+Symbol("id"); //Uncaught TypeError: can't convert symbol to number

但是可以通过 .toString() 或 .description (描述) 实现你所想的

js
let id = Symbol("id");

alert(id.toString()); // Symbol(id)

alert(id.description); // id

全局 Symbol

js
Symbol.for("key");
// 有,返回;
// 没有,新建一个返回

Symbol.keyFor 则反过来,通过 symbol 返回 “key”

系统 Symbol

https://tc39.es/ecma262/#sec-well-known-symbols

它们都被列在了 众所周知的 Symbol 表的规范中:

  • Symbol.hasInstance
  • Symbol.isConcatSpreadable
  • Symbol.iterator
  • Symbol.toPrimitive

for ... in / Object.keys / Object.assign

for ... in 会 忽略 Symbol Object.keys 会 忽略 Symbol

Object.assign 不会忽略 Symbol,无论是 key 还是 value