ES6 学习笔记之 Symbol
- 2020 年 1 月 5 日
- 笔记
ES6 新增的 Symbol 功能还是比较多的,建议大家还是看看原著的内容来充分理解,我仅自己记录一些我可能需要用到的内容。
Symbol 返回的是一个唯一值,类似于 GUID,它的类型是 symbol,不能与字符串混淆。
let s = Symbol(); console.log(typeof s); // symbol
Symbol 定义的方法名,只能通过方括号的方式来调用,如果使用了.运算符则会报错提示找不到这个方法。
let obj = { init() { return 'init'; }, [s]() { return 'Hello.'; } } // obj.s(); 报错 obj[s](); // Hello.
遍历 Symbol 成员
console.log(Object.getOwnPropertyNames(obj)); // [ 'init' ] console.log(Object.getOwnPropertySymbols(obj)); // [ Symbol() ] console.log(Reflect.ownKeys(obj)); // [ 'init', Symbol() ]
Symbol 还可以定义类似枚举类的东西,但它不是重复的,如下例子(来自书中):
const COLOR_RED = Symbol(); const COLOR_GREEN = Symbol(); function getComplement(color) { switch (color) { case COLOR_RED: return COLOR_GREEN; case COLOR_GREEN: return COLOR_RED; default: throw new Error('Undefined color'); } }
Symbol.for 方 Symbol.keyFor() 方法
Symbol.for 类似一个拷贝函数,可以将某个 Symbol 值重复利用。如下所示:
var s1 = Symbol.for('foo'); var s2 = Symbol.for('foo'); console.log(s1 === s2); // true
Symbol.for 先检查是否有同 key 的值存在,如果没有就新建,如果有就返回已经有的。如下所示:
Symbol.for('abc') === Symbol.for('abc'); // true Symbol('abc') === Symbol('abc') // false
Symbol() 是没有登记机制的,所以无论你如何调用都会创建一个新的 symbol 值。而 Symbol.for 不同。Symbol.keyFor 方法可以取到 Symbol.for 登记的类型值的 key。
var ss1 = Symbol.for('abcdef'); console.log(Symbol.keyFor(ss1)); // abcdef var ss2 = Symbol('abcdefg'); console.log(Symbol.keyFor(ss2)); // undefined
内置 Symbol 值
ES6 内置了很多内置值,我仅举个例子演示一下。更多其他内置方法请参考图书。
// Symbol.replace,在调用 replace 时会被调用。 const x = {}; x[Symbol.replace] = (...s) => console.log(s); 'Hello'.replace(x, 'World'); // ['Hello', 'World']