Symbol类型
之前的基础数据类型有:字符串、数值、布尔、对象、null和undefined;ES6新增了一种基础数据类型Symbol,表示独一无二的值,类似ID。
通过 Symbol() 函数生成,生成的是一个原始类型的值,不能使用new命令,直接使用 Symbol() 。
let s=Symbol(); console.log(typeof s); //类型:symbol
console.log(s); ![]()
Symbol() 函数是可以传参数的,其参数表示对变量的描述,是为了显示的时候方便区分,不可用于属性访问。
let s=Symbol("s");
let obj={[s]:"123"}
console.log("s" in obj); //false
console.log(s in obj); //true
特性: 唯一性
Symbol是唯一存在的,是否有参数或参数相等,两个Symbol变量都是不等的
let s1=Symbol(); let s2=Symbol(); console.log(s1===s2); //false
let s1=Symbol("s");
let s2=Symbol("s");
console.log(s1===s2); //false
无法进行隐式转换,需要提前显示转换匹配类型
console.log(s+"变量");
无法将符号值转换为字符串
显式转换:
console.log(s.toString()+"变量"); //字符串 console.log(String(s)+"变量");
console.log(Boolean(s)); //布尔

应用场景
解决对象属性名冲突:
ES5 的对象属性名都是字符串,这容易造成属性名的冲突。有了Symbol类型,保证每个属性的名字都是独一无二的,这样就从根本上防止属性名的冲突。
let a="name",b="name";
let obj={
[a]:"li",
[b]:"wang"
}
console.log(obj); ![]()
设置两个相同的属性名,前一个属性名的值就会被后面相同属性名的值覆盖。
使用Symbol之后:
let a=Symbol(),b=Symbol(); let obj={ [a]:"li", [b]:"wang" }
console.log(obj); ![]()
两个属性名相同但并不会冲突,值也不会被覆盖。
注意:在对象的内部使用 Symbol 值定义属性时,Symbol 值必须放在方括号中

浙公网安备 33010602011771号