Symbol 类型的注意点

1. 不能用 new

Symbol 函数前不能使用 new 命令,否则会报错。

2. 参数是描述

Symbol 函数可以接受一个字符串作为参数,表示对 Symbol 实例的描述,主要是为了在控制台显示或者转为字符串时比较容易区分。

const s = Symbol('id');
console.log(s);          // Symbol(id)
console.log(s.description); // 'id'

3. 作为属性名不可枚举

Symbol 作为属性名,该属性不会出现在 for...in、for...of 循环中,也不会被 Object.keys()、Object.getOwnPropertyNames()、JSON.stringify() 返回。

const k = Symbol('k');
const o = { [k]: 1, a: 2 };
Object.keys(o);                 // ['a']
Object.getOwnPropertyNames(o);  // ['a']
JSON.stringify(o);              // '{"a":2}'

4. Object.getOwnPropertySymbols()

返回一个数组,成员是当前对象所有用作属性名的 Symbol 值:

Object.getOwnPropertySymbols(o); // [Symbol(k)]

5. Symbol.for()

接受一个字符串作为参数,搜索全局 Symbol 注册表,看有没有以该参数为名的 Symbol 值;若有则返回,否则新建并返回。

Symbol.for('x') === Symbol.for('x'); // true(全局复用)
Symbol('x') === Symbol('x');         // false(每次都是新值)

6. Symbol.keyFor()

返回一个已登记的 Symbol 类型值的 key(即 Symbol.for 注册过的),未登记的返回 undefined。

Symbol.keyFor(Symbol.for('x')); // 'x'
Symbol.keyFor(Symbol('x'));     // undefined

来源整理自:vue3js.cn 面试官系列