1、引入Symbol原因
由于ES5中的对象属性名都是由字符串组成,容易造成属性名冲突。原始数据类型Symbol表示独一无二。通过Symbol()函数创建。使得对象属性有字符串类型和Symbol类型。
let s = Symbol()
console.log(typeof(s));//symbol
2、格式:Symbol(“描述”)
如果设置两个Symbol()对象,描述一样或为空,二者也是不一样的。
let s1=Symbol()
let s2=Symbol()
console.log(s1===s2);//false
let s3=Symbol("s")
let s4=Symbol("s")
console.log(s3===s4);//false
3、Symbol不能与其他类型值进行运算,可以转为Boolean值和字符串,但是不能转为数值
(1)Symbol进行运算会报错
let s=Symbol("symbol")
console.log("this is "+s);
//Uncaught TypeError: can't convert symbol to string
(2)Symbol值可以显示为字符串
let s=Symbol("symbol")
console.log(String(s));//Symbol(symbol)
console.log(s.toString());//Symbol(symbol)
(3)Symbol值可以转为Boolean值
let s=Symbol("true")
console.log(Boolean(s));//true
console.log(!Boolean(s));//false
(4)Symbol值不能转为数值
let s=Symbol("1")
console.log(Number(s));
//Uncaught TypeError: can't convert symbol to number
4、获取属性描述
let s= Symbol("My is Symbol")
console.log(s.description);//My is Symbol
5、Symbol的属性遍历
(1)Object.getOwnPropertySymbols()
let obj={}
let a=Symbol("a")
let b=Symbol("b")
obj[a]="A"
obj[b]="B"
console.log(Object.getOwnPropertySymbols(obj));
//Array [ Symbol("a"), Symbol("b") ]
(2)Reflect.ownKeys()
let obj={}
let a=Symbol("a")
let b=Symbol("b")
obj[a]="A"
obj[b]="B"
console.log(Reflect.ownKeys(obj));
//Array [ Symbol("a"), Symbol("b") ]