ES6——symbol

113 阅读1分钟

symbol是ES6中新增的第六种基本类型的数据,代表独一无二的值。

用途:

1、魔术字符串:在代码中多次出现,与代码形成强耦合的具体的字符串和数字,不利于后期维护和修改;
   应尽量消除魔术字符串的存在,使用含义清晰的变量代替;
2、用作对象的属性名;

symbol可以转换为字符串类型/boolean类型

String(symbol());
s1.toString();
Boolean(symbol());

对象的属性名有两种类型:

1、字符串类型
2、symbol类型(对象属性是独一无二,保证不会出现属性名的冲突);
   symbol用作对象属性名时,不可用点操作符;
let s1 = Symbol();
let s2 = Symbol();
s1===s2; // false

属性名的遍历

symbol作为属性名时,通过for...in/for...of循环遍历时查找不到,在Object.keys()/JSON.stringify()中也不会返回。

Object.getOwnPropertySymbols(obj) 可以获取对象中所有symbol类型的属性名。

Reflect.ownKeys(obj) 可以获取对象中的所有属性名,包含常规键名和symbol键名。

Symbol.for()、Symbol()、Symbol.keyFor()

Symbol.for()会在全局环境中登记,不会每调用一次就返回一个symbol类型的值,会先检测是否已存在给定的key值,如果不存在,才会新建。

Symbol.for("bar")===Symbol.for("bar"); // true

Symbol.keyFor()

查找已经登记的symbol类型的key值

let s1=Symbol.for("test");
Symbol.keyFor(s1); // "test"