• 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

  • 相关阅读:
    自助Linux之问题诊断工具strace
    Linux系统与程序监控工具atop教程
    Google C++单元测试框架(Gtest)系列教程之三——测试固件(Test fixture)
    SQLServer2005:在执行批处理时出现错误。错误消息为: 目录名无效
    无法为可更新的订阅设置发布服务器登录名
    忘记SQL SERVER帐户sa的密码
    SQL Server 2008 R2 跟踪标志
    sys.dm_os_volume_stats监控物理磁盘
    SQL SERVER 中常见的高可用方案
    Vim操作的四种模式
  • 原文地址:https://www.cnblogs.com/telnetzhang/p/5771944.html
Copyright © 2020-2023  润新知