Symbol的诞生,也就是Symbol存在的意义
之前我们的对象属性的数据类型都是字符串,没有其他的,所以会导致属性名的重复,导致属性值被覆盖的情况。比如,你使用了一个他人提供的对象,但又想为这个对象添加新的方法,在添加的操作就很容易覆盖原有的方法。所以需要一个独一无二的数据类型来完成这个使命。所以Symbol出来支持大局
Symbol的介绍
1.唯一性
Symbol这个英文单词表示‘唯一’,没错它是javascript的第七中数据类型,表示它是唯一的。
创建一个Symbol类型是不需要new操作符。否则会报错。因为生成Symbol是一个原始类型的值,不是对象。直接let s = Symbol()
let s = Symbol('a')
let ss = Symbol('a')
console.log(s == 's');
//false
通哟上面例子的比较,我们对Symbol的唯一性,有了一定的了解,也就是当你创建了一个Symbol数据后,那么你就是独一无二的存在。
数据类型的修饰
有人会好奇Symbol(‘a’)里面的参数a又是怎么回事,字符串a表示一种修饰,对你当前创建Symbol类型的一种修饰,作为区分使用,否则当你创建多个Symbol数据时,容易混淆
与其他数据类型之前的转化
Symbol不能用四则运算进行操作,否则会报错,它只能用显示的方式转为字符串和布尔值,即:
String(Symbol())/Boolean(Symbol())
作为对象属性
作为对象的属性时,注意以下三种方式来书写
第一种写法
let mySymbol = Symbol()
let a = {}
a[mySymbol] = 'Hello'
第二在写法
let mySymbol = Symbol()
let a = {
[mySymbol]: 'Hello'
}
第三种写法
let mySymbol = Symbol()
let a = {}
Object.defineProperty(a,mySymbol,{value: 'Hello'})
以上打印a[mySymbol]都是Hello
对象属性的遍历
以上说了对象属性的创建,但是我们要格外的注意,Symbol作为属性名,该属性不会出现在for…in,for…of循环中,也不会被Object.keys(),Object.getOwnPropertyNames(),JSON.stringify()返回。所以我们可以用Object.getOwnPropertySymbols方法,获取指定对象的所有Symbol属性名
如果一个对象里面有字符串属性又有Symbol的属性,那必须要适应新API方法:Reflect.ownKeys(),这个方法就可以返回对象所有的属性,也就是字符串属性和Symbol属性。
let person = {
name: '小明',
age: 12,
[Symbol('level')] : 'A'
}
console.log(Object.keys(person));
/*
0: "name"
1: "age"
*/
console.log(Object.getOwnPropertySymbols(person));
/*
0: "name"
1: "age"
*/
console.log(Reflect.ownKeys(person));
/*
0: "name"
1: "age"
2: Symbol(level)
*/