天天看点

JS-Symbol特性

title: JS-Symbol特性

date: 2020-06-15 16:12:24

tags:

- JavaScripe查漏补缺

- Symbol类型

Symbol前缀标识

可以唯一标识一个数据,可以理解为永不重复的字符串

两种声明方式

//方式一,字面量方法,symbol不需要new关键字
let a=symbol("woshia")
let b=symbol("woshib")
console.log(typeof a)//symble
//方式二,for方法
let c = Symbol.for("zbb");//for方法,系统会记录下这个Symbol
let d = Symbol.for("zbb");//第二次会查之前是否已经声明过,如果声明过就直接拿过来。反复使用同一个Symbol的情况

console.log(c==d)//true
console.log(a==b)//false
console.log(Symbol.keyFor(c))//zbb
console.log(Symbol.keyFor(a))//undefined,只有for方法定义的才能使用keyFor方法
console.log(a)//symbol(woshia)
console.log(a.toString())//symbol(woshia),toString依然是返回symbol本身
console.log(a.description)//woshia,只有description才是返回内部的描述。注意,是a.description而不是a.description,也就是说description是一个数据属性,不是方法属性
           

使用实例

let user1 = {
      name: "李四",
      key: Symbol()//1
    };
    let user2 = {
      name: "李四",
      key: Symbol()//2,就算没有传入参数,1和2也是不相等的
    };
    let grade = {
      [user1.key]: { js: 100, css: 89 },//由于键也是一个变量所以要用[]先取值
      [user2.key]: { js: 35, css: 55 }
    };
//如果不使用symbol,那么同名情况,会被最后一个覆盖
    console.log(grade[user2.key]);//{ js: 35, css: 55 }
           

Symbol属性是私有属性,无法被for-in或者for-of遍历到S

遍历所有属性的方法;for-in与for-of遍历普通属性;getOwnPropertySymbols()遍历Symbol属性;Reflect.ownKeys()遍历所有属性。

let hd = {
      name: "李四",
      [symbol]: "lisi"
    };
    for (const key in hd) {
      console.log(key);//只有name
    }
    for (const key of Object.getOwnPropertySymbols(hd)) {
      console.log(key);//只有symbol
    }
    for (const key of Reflect.ownKeys(hd)) {
      console.log(key);//所有属性,name与Symbol
    }