zoukankan      html  css  js  c++  java
  • ES6-Symbol

    javaScript的数据类型:number,string,boolean,undefined,null,object

    ES6带来了一个新的数据类型:symbol

    目的是:解决对象的属性名冲突的问题。

    let sm1=Symbol();

    let sm2=Symbol();

    console.log(sm1);   //Symbol()

    console.log(sm2);   //Symbol()

    console.log(typeof sm1)    //symbol

    console.log(sm1===sm2)   //false

    从测试可以发现 虽然sm1和sm2看起来很一样,但他们其实是不相等的。为了让不同的Symbol看起来不一样,我们可以通过参数来实现:

    let sm1=Symbol('sm1');

    let sm2=Symbol('sm2');

    console.log(sm1);   //Symbol(sm1)

    console.log(sm2);   //Symbol(sm2)  

    参数就像是Symbol的描述,用来区分看起来相同,实则不同的Symbol,但要注意,即使描述相同,sm1和sm2也不同,毕竟他们本来就是不同的东西。

    下面我们来看用Symbol解决对象属性命名冲突的注意问题:

    (1)当symbol值作为对象的属性名时,不能用点号来取得对应的属性值。

    let name=Symbol();  

    let person={

      [name]:'Lily'     //以Symbol作为属性名name

    };

    console.log(person[name])  //Lily

    console.log(person.name)    //undefined  不能用点号来取得对应的属性值

    (2)当symbol值作为对象的属性名时,也不能用点号来设置对应的属性值

    let name=Symbol();  

    let person={}

    paseon.name='Lily'     //以Symbol作为属性名name,以点号赋值。

    console.log(person[name])  //undefined 不能用点号来设置对应的属性值

    console.log(person['name'])  //Lily  

    console.log(person.name)    //Lily  

    可以看出,当用点号赋值时,其实javascript就不会把点号后的值理解为symbol类型,而是字符串类型,就相当于没有使用symbol

    (3)如何遍历symbol类型的属性名:Object.getOwnPropertySymbols()

    let name=Symbol();  

    let person={

      [name]:'Lily' ,    //symbol类型

      'age':12   //string类型

    };

    Object.keys(person)   //['age']

    for(let key in person){

      console.log(key)   // age

    我们发现使用Object.keys()和for...in都无法遍历出symbol类型的属性。

    我们可以用Object.getOwnPropertySymbols()来获取symbol类型的属性:  

    Object.getOwnPropertySymbols(person) //  [Symbol(name)]

    (4)获取对象上的所有属性名:Reflect.ownKeys()

    Reflect.ownKeys(person)  // ['age',Symbol(name)]

    (5)用Symbol.for()创建全局变量

    let sm1=Symbol.for('name');

    let sm2=Symbol.for('name');

    之前我们说过,在用Symbol创建变量时,即使描述相同,两个变量实际也是不同的(console.log(sm1===sm2)   //false  )。

    但这里,我们用Symbol.for()来创建得到的结果是:

    console.log(sm1===sm2)   //true

    原因是:使用Symbol.for()来创建的symbol值被登记在全局环境中,以便用Symbol.for()来搜索。也就是使用Symbol创建的symbol值是无法用Symbol.for()来搜索的。

    let sm1=Symbol('name');

    let sm2=Symbol.for('name');

    console.log(sm1===sm2)   //false

    (6)Symbol.keyFor()  返回一个被登记在全局环境中的symbol值的key,没有返回undefined

    let sm1=Symbol.for('name');

    Symbol.keyFor('sm1')   //name

    let sm1=Symbol('name');

    Symbol.keyFor('sm1')   // undefined

  • 相关阅读:
    基本技能训练之线程
    关于UEditor的使用配置(图片上传配置)
    PAT 乙级练习题1002. 写出这个数 (20)
    codeforces 682C Alyona and the Tree DFS
    codeforces 681D Gifts by the List dfs+构造
    codeforces 678E Another Sith Tournament 概率dp
    codeforces 680E Bear and Square Grid 巧妙暴力
    codeforces 678D Iterated Linear Function 矩阵快速幂
    codeforces 679A Bear and Prime 100 交互
    XTUOJ 1248 TC or CF 搜索
  • 原文地址:https://www.cnblogs.com/telnetzhang/p/5771944.html
Copyright © 2011-2022 走看看