ES6——Symbol

原始数据类型,表示独一无二的值

let sy = Symbol('kk')
console.log(sy)		//Symbol(kk)
typeof(sy)		//'Symbol'

相同参数 Symbol() 返回的值不相等

let sy1 = Symbol('kk')
sy == sy1	//false
  • 用做属性名

    每一个 Symbol 的值是不相等的,保证属性名不重复

    //方法1
    let sy = Symbol('key1')
    let obj = {}
    obj[sy] = 'kk'
    console.log(obj)	//{Symbol(key1):'kk'}
    //方法2
    let obj = {
        [sy]: 'kk'
    }
    //方法3
    Object.defineProperty(obj,sy,{value:'kk'})
    

    : Symbol 作为对象属性名不能用点运算符,必须用方括号

    Symbol 作为属性名,该属性为共有属性,可在类的外部访问,但不会出现在for...in,for...of循环中,也不会被 Object.keys() Object.getOwnPropertyNames() 返回。但可通Object.getOwnPropertySymbols()Reflect.ownKeys() 取到

    let sy = Symbol('key1')
    let obj = {
        [sy]: 'kk'
    }
    for(let i in obj){	//不会进入循环
        console.log(i)
    }
    console.log(Object.keys(obj))   //[]
    console.log(Object.getOwnPropertySymbols(obj))  //[Symbol(key1)]
    console.log(Reflect.ownKeys(obj))   //[Symbol(key1)]
    
  • 方法

    • Symbol.for()

      首先在全局搜索被登记的Symbol中是否有该字符串参数作为名称的 Symbol 值,如果有即返回 Symbol 值,若没有则新建并返回一个以该字符串参数为名称的 Symbol 值并登记在全局中供搜索

      let sy = Symbol('kk')
      let sy2 = Symbol.for('kk')
      sy == sy2 //false
      let s3 = Symbol.for('kk')
      sy2 == sy3 //true
      

      : 初始化的 Symbol 的变量并不会在全局中登记

    • Symbol.keyFor()

      返回一个已登记的 Symbol 类型值的 key ,用来检测该字符串参数作为名称的 Symbol 值是否已被登记。

      Symbol.keyFor(sy)	//undefined
      Symbol.sy2(sy2)		//'kk'
      

猜你喜欢

转载自www.cnblogs.com/angle-yan/p/13371312.html