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