Symbol类型是原始数据类型,它表示是独一无二的。
const name = Symbol('tom');
const name2 = Symbol('tom');
console.log(name === name2);//false
一旦定义Symbol类型的变量值,即使定义的值是相同的,name和name2也是独一无二的,它们的内存地址是不同的。
Symbol的主要用途是用于定义对象的私有变量
let name = Symbol('name');
let obj = {
//name:'tom'//这种赋值方式赋上的值{name: "tom"} ①
//[name]:'tom'//这种方式赋上的值{Symbol(name): "tom"} ②
};
obj[name] = 'tom';//这种方式赋上的值{Symbol(name): "tom"} ③
console.log(obj);//{Symbol(name): "tom"}
console.log(obj.name);//undefined
console.log(obj[name]);//tom
给对象的Symbol类型的私有变量赋值的时候应当使用上述②或③两种方式,使用第一种方式赋上的值并不会是Symbol类型,同时对Symbol类型的私有变量进行取值的时候也应当使用对象[变量名]进行取值。
无法对对象内Symbol类型的私有变量进行遍历
let name = Symbol('name');
let obj = {
[name]: 'tom'
};
for (let key in obj) {
console.log(key); //取不到值
}
获取Symbol声明的属性名(作为对象的key)
//方式一
let s = Object.getOwnPropertySymbols(obj);
console.log(s[0]);//Symbol(name)
//方式二,使用反射
let m = Reflect.ownKeys(obj);
console.log(m[0]);//Symbol(name)