ES6-Symbol

 

大家都知道ES5对象的属性名都是唯一的,不可重复的。

如: 
    var a = {name: 'value'};

    a.name = 'value2';

    这样的话a里面的name的属性值就会被覆盖,不会生成第二个叫name的属性,具备唯一性。

  ES6引入了一种新的原始属性类型:Symbol,表示唯一的值(独一无二)。

  复习ES5数据类型:Number、String、Boolean、Null、Undefined

 

  注意点:Symbol属性不能new,直接用它。

  

如:
    let newDataStructure = Symbol('abc');

    console.log(typeof newDataStructure); //symbol 
      检测数据类型返回symbol
    console.log(typeof newDataStructure); //Symbol(abc)
       打印全部被Symbol包裹abc

  

  symbol属性内不仅可以放number、string、boolean类型外,还可以放对象

  注意:放入对象一定需要具备一个toString方法,如果对象内没有toString方法就沿着原型链找toString方法。

  

    //没放toString的结果
    let o = Symbol({
        name: 'zzh'
    });
    console.log(o);//Symbol([object Object])


    //有toString方法的结果
    let s = Symbol({
        name: 'zzh',
        toString: function(){
            return 'age 18'
        }
    });
    console.log(s.name);//Symbol(age 18)

  

  Symbol属性具备唯一性。

  

    let o = Symbol('a');

    let s = Symbol('a');

    console.log(o == s);//false
    //Symbol与NaN很象谁都不等于
  
   let obj = {
     [o]: 's1',
       [s]: 's2'
   }
  console.log(obj)//{Symbol(a): "s1", Symbol(a): "s2"}
  // 两个名字一样,验证了Symbol的唯一性

   

  取值方法:

    

    let o = Symbol('a');

    let s = Symbol('a');

    let obj = {
        [o]: 's1',
        [s]: 's2'
    }
    console.log(obj[o])//s1
    console.log(obj[s])//s2
    // 取值方法object[name]

  

   Symbol.iterator属性:
 
  
console.log(Symbol.iterator);//Symbol(Symbol.iterator) 等同于 Symbol('Symbol.iterato');



//Array Set Map arguments nodelist等都有Symbol.iterator属性

  

  

 

posted @ 2019-05-05 01:44  set_Promise  阅读(186)  评论(0编辑  收藏  举报