欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

ES6知识点整理——symbol

程序员文章站 2022-07-16 20:05:51
...

symbol
ES5对象属性名都是字符串容易造成属性名的冲突。

var a = { name: 'lucy'};
a.name = 'lili';//这样就会重写属性

ES6引入了一种新的原始数据类型Symbol,这种数据类型提供独一无二的值。也就是说用symbol声明的变量得到的值永远不想等,保证他们是唯一的。

注意,Symbol函数前不能使用new命令,否则会报错。这是因为生成的Symbol是一个原始类型的值,不是对象

Symbol函数可以接受一个字符串作为参数,表示对Symbol实例的描述,主要是为了在控制台显示,或者转为字符串时,比较容易区分。

{
  // 声明
  let a1=Symbol();
  let a2=Symbol();
  console.log(a1===a2);//false
 var s1 = Symbol("foo");
 var s2 = Symbol("foo");
 console.log(s1 === s2 );// false
}

Symbol.for(),Symbol.keyFor()
Symbol.for机制有点类似于单例模式,首先在全局中搜索有没有以该参数作为名称的Symbol值,如果有,就返回这个Symbol值,否则就新建并返回一个以该字符串为名称的Symbol值。和直接的Symbol就点不同了

{
   let a3=Symbol.for('a3');
   let a4=Symbol.for('a3');
   console.log(a3===a4);//true
}

Symbol.keyFor方法返回一个已登记的Symbol类型值的key。实质就是检测该Symbol是否已创建

{
  var s1 = Symbol.for("foo");
  Symbol.keyFor(s1) // "foo"
  var s2 = Symbol("foo");
  Symbol.keyFor(s2) // undefined
}

Symbol()方法生成一个Symbol类型时,没有登记,所以每次调用Symbol(哪怕传入相同的字符串)会返回不同的Symbol,但是Symbol.for()在生成Symbol时候进行了登记,每次再次调用时,都会先寻找是否有传入相同参数的Symbol,故只有Symbol.for()产生的Symbol才能被Symbol.keyFor()找到。

symbol用于属性名

    var s1 = Symbol();
    var s2 = Symbol();
    var s3 = Symbol();
    var obj = {
        [s1]: 'hi'
    };
    obj[s2] = 'ES6';
    Object.defineProperty(obj, s3, {
        value: 'ES2015'
    });
    console.log(obj); //Object {Symbol(): "hi", Symbol(): "ES6", Symbol(): "ES2015"}
    console.log(obj.s1); //undefined -> 所以当用Symbol作为属性名时候,不能用.运算符访问属性
    console.log(obj[s1]); //hi
    console.log(obj['s1']); //undefined

注意:Symbol作为属性名,该属性不能被for...in...和let...of...拿到,也不会被 Object.keys(), Object.getOwnPropertyNames() 返回。可以用Object.getOwnProertySymbols()这个api返回一个数组,成员是当前对象的所有用作属性名的symbol值。

{
  let a1=Symbol.for('abc');
  let obj={
    [a1]:'123',
    'abc':345,
    'c':456
  };
  console.log('obj',obj);//obj Object{abc:345,c:456,symbol(abc):'123'}

  for(let [key,value] of Object.entries(obj)){
    console.log('let of',key,value);//let of abc 345 let of c 456
  }

  Object.getOwnPropertySymbols(obj).forEach(function(item){
    console.log(obj[item]);//123
  })

  Reflect.ownKeys(obj).forEach(function(item){
    console.log('ownkeys',item,obj[item]);//ownkeys abc 345 ownkeys c 456 ownkeys symbol(abc) 124
  })
}