zoukankan      html  css  js  c++  java
  • ES6系列_10之Symbol在对象中的作用

    在ES5中 对象属性名都是字符串,这容易造成属性名的冲突,比如,你使用了一个他人提供的对象,但又想为这个对象添加新的方法(mixin 模式),新方法的名字就有可能与现有方法产生冲突,于是 ES6 引入了Symbol。Symbol是一种新的原始数据类型,表示独一无二的值。它是继undefinednull、布尔值(Boolean)、字符串(String)、数值(Number)、对象(Object)六种数据类型之后的第七种数据类型。凡是属性名属于 Symbol 类型,就都是独一无二的,可以保证不会与其他属性名产生冲突。

    1.声明Symbol

    Symbol函数可以接受一个字符串作为参数,表示对 Symbol 实例的描述,主要是为了在控制台显示,或者转为字符串时,比较容易区分。

    var f= Symbol();//Symbol()
    var f= Symbol('foo');//Symbol(foo)
    // 没有参数的情况
    let s1 = Symbol();
    let s2 = Symbol();
    
    s1 === s2 // false
    
    // 有参数的情况
    let s1 = Symbol('foo');
    let s2 = Symbol('foo');
    
    s1 === s2 // false

    注意,Symbol函数的参数只是表示对当前 Symbol 值的描述,因此相同参数的Symbol函数的返回值是不相等的。

    s1s2都是Symbol函数的返回值,而且参数相同,但是它们是不相等的。

    2.Symbol在对象中的应用

    Symbol作为属性名:

    let mySymbol = Symbol();
    
    // 第一种写法
    let a = {};
    a[mySymbol] = 'Hello!';
    
    // 第二种写法
    let a = {
      [mySymbol]: 'Hello!'
    };
    
    // 第三种写法
    let a = {};
    Object.defineProperty(a, mySymbol, { value: 'Hello!' });
    
    // 以上写法都得到同样结果
    a[mySymbol] // "Hello!"

    赋值-括号形式:

    a[mySymbol]='web';

    3.Symbol对象元素的保护作用

    在对象中有很多值,但是循环输出时,并不希望全部输出,那我们就可以使用Symbol进行保护。

    没有进行保护的写法:

    var obj={name:'小明',skill:'web',age:18};
    for (let item in obj){
        console.log(obj[item]);
    }

    现在我不想别人知道我的年龄,这时候我就可以使用Symbol来进行循环保护。

    let obj={name:'小明',skill:'web'};
    let age=Symbol();
    obj[age]=18;
    for (let item in obj){
        console.log(obj[item]);//小明、web
    } 
    console.log(obj[age]);

     待续.....

  • 相关阅读:
    Protobuf通信协议
    python发送消息到activeMQ后java接收到BinaryMessage的坑
    golang time.Duration() 问题
    golang操作redis
    golang之网络编程
    golang之反射
    golang之goroutine和channel
    golang之单元测试
    golang之文件操作
    XmlHelper 工具类
  • 原文地址:https://www.cnblogs.com/wfaceboss/p/10068369.html
Copyright © 2011-2022 走看看