Symbol是什么
- Symbol是ES6中新增的一个基本数据类型,翻译为符号。
- 在ES6之前,对象的属性名都是字符串形式,那么很容易造成属性名冲突;
- 比如原来有一个对象,我们希望在其中添加一个新的属性和值,但是我们在不确定它原来内部有什么内容的情况下,很容易造成冲突,从而覆盖掉它内部的某个属性;
- 或者开发中我们使用混入,那么混入中出现了同名的属性,必然有一个会被覆盖掉。
- 使用sumbol会生成一个独一无二的值,永远不会覆盖前面的值
- symbol的值是通过symbol函数来生成的,生成后可以作为属性名;
- 对象的属性名可以使用字符串,也可以使用symbol值;
-
const a = Symbol(); //调用symbol const b = Symbol(); const obj = { [a]: 1, //将a作为obj的键 }; obj[b] = 2; //将b作为obj的键 console.log(obj); //输出对象
- symbol即使多次创建值,他们也是不同的
- symbol函数执行后每次创建出来的值都是独一无二的;
- 我们也可以在创建symbol值的时候传入一个描述description(这是es10新增特性)
获取symbol对应的key
-
console.log(Object.keys(obj)); //获取不到symbol console.log(Object.getOwnPropertySymbols(obj)); //单独获取symbol数组 const Symbolkeys = Object.getOwnPropertySymbols(obj); //得到sumbol键的值 for (const key of Symbolkeys) { console.log(obj[key]); }
创建相同的Symbol
- 我们可以使用Symbol.for来做到这一点
- 并且可以通过Symbol.keyFor方法来截取对应的key
-
const s3 = Symbol("ccc");//ccc是symbol的一个解释 console.log(s3.description); //得到s3里面的ccc const s4 = Symbol.for("aa"); const s5 = Symbol.for("aa"); console.log(s4 == s5); //得到true console.log(Symbol.keyFor(s5));//得到s5里面的值