ES6 -symbol基础


一:Symbol的基本概述


  • ES5对象的属性都是字符串,这容易造成属性名的冲突。而ES6引入类型·Symbol就是从根本上防止属性名冲突。
  • 他是javascript的第七个原始数据类型。前六个分别为Undefined,Null,Object,String,Number.Bealean
  • 1.对象名可以用字符串或者symbol两种类型。而symbol类型唯一,不会和其他属性名发生冲突。
   {
             let s = Symbol();
             console.log(s);   //Symbol()
             console.log(typeof s);  //symbol

            //上述代码表明变量s为symbol类型,并且symbol是原始类型的值,不能使用new命令,且不是对象,
            //自然不能添加属性和方法。
         }

  • 2.Symbol函数可以接受一个字符串作为参数,表示对Symbol实例的描述,身份id
 {
             var s1 = Symbol('tom');
             var s2 = Symbol('jerry');

             console.log(s1);  //Symbol(tom)
             console.log(s2);  //Symbol(jerry)
             //这样方便我们在控制台进行区分
         }
  • 3.Symbol参数只是对当前Symbol值的描述,相同参数的Symbol函数的返回值是不相同的。
{
            //没有参数的情况
            var s1 = Symbol();
            var s2 = Symbol();

            console.log(s1 === s2);  //false

            //有参数的情况

            var s3 = Symbol('tom');
            var s4 = Symbol('tom');
            console.log(s3 === s4);  //false
        }
  • 4.symbol值不能与其他类型的值做运算,但是可以显示转换为字符串和布尔值
    {
            let s = Symbol('tom');
            console.log(s.toString());   //"Symbol(tom)"
            console.log(Boolean(s));     //true
        }

二: 作为属性名的symbol


  • 1.由于每一个Symbol值都是不相等的,这意味这Symbol值可以作为标识符用于对象的属性名。
{
            let mySymbol = Symbol();

            1,第一种写法
            let a = {id:1};
            a[mySymbol] = 'hello';
            console.log(a);  
            {id: 1, Symbol(): "hello"}

            2.第二种写法
            let a = {
                id:0,
                [mySymbol]:'hello'
            }
            console.log(a);
            {id: 0, Symbol(): "hello"}

            3.第三种写法
            let a = {id:2};
            Object.defineProperty(a,mySymbol,{
                value:'hello'
            })
            console.log(a);
            {id: 2, Symbol(): "hello"}
        }

三:属性名的遍历


这个我的博客里面有对遍历方法的详细解读
        symbol类型只有两种方法可以遍历出他的属性名
        {
            1.Object.getOwnPropertySymbols()
            let a = Symbol('a');
            let b = Symbol('b');
            let obj = {
                [a]:'hello',
                [b]:'world'
            }

            let newArray = Object.getOwnPropertySymbols(obj);
            console.log(newArray)
            (2) [Symbol(a), Symbol(b)]
            返回一个数组,成员是当前对象属性为symbol的属性名



            2.Reflect.ownKeys()
            let a = Symbol('a');
            let b = Symbol('b');
            let obj = {
                [a]:'hello',
                [b]:'world',
                id:1,
                name:'mySymbol'
            }

            let newArray = Reflect.ownKeys(obj);
            console.log(newArray)
            (4) ["id", "name", Symbol(a), Symbol(b)]
            该方法会返回这个对象的所有自身属性
        }

四:Symbol.for() Symbol.keyFor()


{
            //symbol生成的都是不同的symbol类型的值
            //symbol.for  会在全局检索,如果存在就生成相同的值,不存在才重新创建一个新的变量
            console.log(Symbol('foo') === Symbol('foo'));   //false
            console.log(Symbol.for('foo') === Symbol.for('foo'));   //true


            //Symbol.keyFOr() 返回一个已经登记的symbol值的key
            let s1 = Symbol.for('s1');
            let s2 = Symbol('s2');

            console.log(Symbol.keyFor(s1));   //s1
            console.log(Symbol.keyFor(s2));    //undefined

            //因为s1用Symbol.for()登记过了,而s2没有被登记过。
        }

关于Symbol的11个基本内置属性,学完了class一起整理.

发布了85 篇原创文章 · 获赞 16 · 访问量 6116

猜你喜欢

转载自blog.csdn.net/qq_43955202/article/details/104213704