1.Symbol
说明:引入一种新的原始数据类型,表示独一无二的值,Symbol值通过symbol()函数生成
let s1 = Symbol()
let s2 = Symbol()
console.log(s1 === s2); //false
console.log(typeof s1); //symbol
注意:Symbol()函数前不能用new命令,否则会报错(基本数据类型)
2.Symbol()函数
说明:Symbol()函数可以接受一个字符串参数,表示对Symbol实例的描述
let s3 = Symbol("name")
console.log(s3); //Symbol(name)
Symbol值不能与其他类型的值进行运算
let s4 = Symbol("my")
console.log(`${s4}是我`); // Cannot convert a Symbol value to a string
3. Symbol 值也可以转为字符串
console.log(s4);
let s5 = String(s4)
console.log(`${s5}是我`); //Symbol(my)是我
4.Symbol 值也可以转为布尔值
let s6 = Symbol("good")
let s7 = Boolean(s6)
console.log(s7); //true
注意:无论Symbol()里面的值是什么,当转成了布尔类型的值后都为true(包括null,NaN,undefined)
5.Symbol.prototype.description
let s8=Symbol("better")
console.log(s8.description); //btter
说明:Symbol值的实例属性description返回的是Symbol括号内部的值
6.作为属性名的Symbol
说明:因为每一个Symbol值都是不相等的,这意味着只要用Symbol值作为标识符,用于对象的属性名,就可以保证不会出现同名的属性
//方法1
let symbol=Symbol()
let obj1={}
obj1[symbol]="张三"
console.log(obj1); //{Symbol(): '张三'}
// 方法2
Object.defineProperty(obj1,symbol,{value:'李四'}) //{Symbol(): '李四'}
console.log(obj1);
注意:Symbol 值作为对象属性名时,不能用点运算符,因为点运算符后面是字符串,所以不会读取symbol作为表示名所指代的那个值。
7.Object.getOwnPropertySymbols()
说明:获取对象的所有Symbol属性名
let symbol1=Symbol("id2")
let symbol2=Symbol("id3")
const obj2={
[symbol1]:"李四",
[symbol2]:"王二",
name:"FOREVER"
}
console.log(Object.getOwnPropertySymbols(obj2)); //[Symbol(id2), Symbol(id3)]
console.log(Reflect.ownKeys(obj2)); //['name', Symbol(id2), Symbol(id3)]
注意:我们可以利用这个特性,为对象定义一些非私有的,又希望只用于内部的方法
8.Symbol.for()
说明:可以重新使用同一个Symbol值,它可以接受字符串作为参数,搜索有没有该参数作为名称的Symbol值,如果没有就新建一个字符串Symbol值。
let s9=Symbol.for("great")
let s10=Symbol.for("great")
console.log(s9===s10); //true
9.Symbol.keyFor()
说明:Symbol.keyFor()方法返回一个已登记的Symbol类型值的key; Symbol()写法没有登记机制
let s11=Symbol.for("insist")
console.log(Symbol.keyFor(s11)); //insist