什么是symbol
symbol是es6新增的一种基本数据类型
symbol用来表示一个独一无二的值,其格式是let name=Symbol('标识字符串(用来进行标识,无任何意义)'),基本数据类型声明时不要加new
symbol类型可以作为属性名,使用时需要加上[]
例子:
let name = Symbol('name')
let obj = {
[name]: '哈哈',
age: 22
}
obj.name = '呵呵';
obj[Symbol('nmae')] = '嘿嘿';
console.log(obj)
打印结果如下:
![](https://img-blog.csdnimg.cn/img_convert/beacdcdf950309b57c8c93f6a112b113.png)
symbol类型的值时独一无二的,所以默认创建一个新的name属性,不会被覆盖
注意点
类型转化只能转化为字符串和布尔值,不能转化为数值
console.log(String(name));//Symbol(name)
console.log(Boolean(name));//true
console.log(Number(name));//报错
不能做任何运算
console.log(name+111)
console.log(name+'ccc')
//报错
symbol生成的值作为属性或者方法的时候,一定要保存下来,否则后续无法使用
let name=Symbol('name');
let obj={
// name:'哈哈',
[Symbol('name')]:'lbj'
}
console.log(obj.name); //访问不到,因为 [Symbol('name')]又是一个新的值,和上面的name不是同一个
for循环遍历对象的时候是无法遍历出symbol的属性和方法的。
Object.getOwnPropertySymbols():返回对象中只包含symbol类型key的数组
Reflect.ownKeys() :返回对象中所有类型key的数组(包含symbol)
let name=Symbol('name');
let obj={
[name]:'哈哈哈',
age:12,
}
for(let key in obj){
console.log(key) //只能打印出age
}
console.log(Object.getOwnPropertySymbols(obj))//['Symbol(name)']
console.log(Reflect.ownKeys(obj))//['Symbol(name)','age']
symbol自带的方法
symbol.for()
let s1 = Symbol.for('foo');
let s2 = Symbol.for('foo');
s1 === s2 // true
symbole.keyFor() 返回一个已登记的 Symbol 类型值的key。
let s1 = Symbol.for("foo");
Symbol.keyFor(s1) // "foo"
let s2 = Symbol("foo");
Symbol.keyFor(s2) // undefined