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
05-14 21:00