美文网首页
ECMAScript6--10.Symbol用法

ECMAScript6--10.Symbol用法

作者: 飞菲fly | 来源:发表于2017-10-20 16:15 被阅读24次

    Symbol(ES6中新增加的数据类型)

    1.Symbol的概念
    * 这种数据类型提供独一无二的值;
    比如:在js中声明一个数据类型number=5;还可以通过变量b生成一个数据类型number=5的一个值;这两个值是相等的,可以理解是一样的;
    用Symbol声明的这个值不重复不相等; 用Symbol这种数据类型声明一个变量a,同样在用Symbol声明一个变量b,a和b永远都相等;
    * 用这种方式声明的数据类型变量的话,得到的值永远不会相等,保证它们是唯一的,独一无二的;

    2.symbol的作用

    • symbol怎么声明一个值;
    {      
        //symbol声明的变量永远是独一无二的;
        let a1 = Symbol();
        let a2 = Symbol();
        console.log(a1===a2); //false
        
        
        //变量是独一无二,使用的时候怎么取到这个值,没法恢复和还原?
        //Symbol.for(参数);这个参数是一个key值,当有这个key值的时候,for去声明这个独一无二的
         变量的时候,会先检查这个key值,是不是在全局注册过,如果注册过就返回那个值,如果没注册过,
         就调symbol生成一个独一无二的值;
    
        //用a3这个key值,生成了一个独一无二的变量a3;
        let a3 = Symbol.for('a3'); 
    
       //在去生成a3为key值的变量的时候,之前已经定义过a3,a4应该拿到的是a3这个值;所以a3和a4应该
       是相等的;
        let a4 = Symbol.for('a3'); 
    
        console.log(a3===a4);// true
        
    }
    
    • 怎么用?什么场景用?

    1.如果之前不实用Symbol.for定义一个a1独一无二的值,可以理解key值是abc,下面obj里面也有一个abc,这个时候会报错的;
    2.obj这里定义过abc了,当别人继承或重写这个属性的时候,它也有个abc这个属性,它的写法会把之前的给覆盖掉,这个是我们不想要的一个结果;

    ——对象中有用到symbol做key值,通过for in或者let of都是拿不到它的属性的;

    • Object.getOwnPropertySymbols(obj)
      ——能拿到symbol作为key值的一个对象的属性;
    • Reflect.ownKeys(obj)
      ——返回的结果包含了symbol的变量作为key值的一个属性,也包含非symbol变量的一个属性;
    {
        let a1 = Symbol.for('abc');
        let obj = {
            [a1]:'123',
            'abc':345,
            'c':456
        };
        
        console.log('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和c这两个属性;Symbol(abc)这个属性没有拿到;
            //let of abc 345 
            //let of c 456
        }
        
        Object.getOwnPropertySymbols(obj).forEach(function(item){
            console.log(obj[item]); 
            //取到了a1变量这个值是123;
        });
        
        //取所有的key、value值,返回值是一个数组;用forEach遍历;
        Reflect.ownKeys(obj).forEach(function(item){
            console.log('ownKeys',item,obj[item]);
            //ownKeys abc 345
            //ownKeys c 456 
            //ownKeys Symbol(abc) 123
        }); 
              
    }

    相关文章

      网友评论

          本文标题:ECMAScript6--10.Symbol用法

          本文链接:https://www.haomeiwen.com/subject/rhyvuxtx.html