1 什么是 Symbol ? Symbol,表示独一无二的值。它是 JS 中的第七种数据类型
let s1 = Symbol();
let s2 = Symbol();
console.log(s1===s2);//false
注意
Symbol 函数前不能使用 new 否则会报错,原因在于Symbol 是一个原始类型的值,不是对象。
Symbol 可以接收一个字符串作为参数,表示对Symbol的描述,主要是为了在控制台显示,或者转为字符串的时候,比较容易区分,不和任何数据相等
let s1 = Symbol('momo');
let s2 = Symbol('zhuanzhuan');
console.log(s1===s2);//false
console.log(Symbol('momo') === Symbol('momo'));//false
Symbol.for()首先在全局中搜索有没有以该参数作为名称的Symbol值,如果有,就返回这个Symbol值,否则就新建并返回一个以该字符串为名称的Symbol值。和直接的Symbol就点不同了。
let s3=Symbol.for('s3');
let s4=Symbol.for('s3');
console.log(s3===s4);//true
Symbol的作用可以解决冲突
let s1=Symbol.for('abc');
let obj={
[s1]:'123',
'abc':345,
'c':456
}
console.log(obj);//{abc: 345, c: 456, Symbol(abc): "123"}
2 Symbol 数据类型的转换
可以转换成字符串,布尔值
console.log(String(Symbol('momo'))); // Symbol(momo)
console.log(Symbol('zhuanzhuan').toString()); // Symbol(zhuanzhuan)
console.log(!!Symbol()); // true
不能做任何运算
console.log(Number(Symbol()));//报错
console.log(Symbol('momo') + 'chuqiao');//报错
console.log(Symbol('momo') * 100);//不能做任何运算。
3 作为对象的属性名
let yy = Symbol('yy');
const obj = {};
obj[yy] = 'hello';
console.log(obj);//{Symbol(yy): "hello"}
console.log(obj[yy]);//hello
let ss = Symbol('ss');
const data = {
[ss]: 'momo'
};
console.log(data);//{Symbol(ss): "momo"}
console.log(data[ss]);//momo
4.不能被for...in for...of values() keys() entries()循环遍历
虽然不能被遍历,但是也不是私有的属性,可以通过Object.getOwnPropertySymbols方法获得一个对象的所有的Symbol属性
通过Reflect.ownKeys()可以遍历对象所有的属性
const data = {
[Symbol()]: 123,
a: 1,
b: 2
};
console.log(data);//{a: 1, b: 2, Symbol(): 123}
console.log(data['Symbol()']);//undefined
for(let i in data){
console.log(i);//a b
}
console.log(Object.getOwnPropertySymbols(data)); // [Symbol()]
console.log(data[Object.getOwnPropertySymbols(data)[0]]);//123
console.log(Reflect.ownKeys(data));//["a", "b", Symbol()]