• ES6-11学习笔记--Symbol


    Symbol:一种新的原始数据类型
     
    声明方式:
    let s1 = Symbol()
    let s2 = Symbol()
    console.log(s1); // Symbol()
    console.log(s2); // Symbol()
    console.log(s1 === s2); // false
    
    let s3 = Symbol('foo');
    let s4 = Symbol('bar');
    console.log(s3); // Symbol(foo)
    console.log(s4); // Symbol(bar)
    console.log(s3 === s4); // false
    

      

    如果Symbol声明时传入的参数是对象,会自动调用自身的toString方法:
    const obj = {
        name: '张三'
    }
    let s5 = Symbol(obj)
    console.log(s5); // Symbol([object Object])
    

      

    for方法:
    使用for方法会在全局进行表述的定义,下次再使用for定义,会先去全局定义里面找有没有定义过的描述
    let s6 = Symbol.for('foo')
    let s7 = Symbol.for('foo')
    
    function foo() {
        return Symbol.for('foo')
    }
    s8 = foo()
    console.log(s6 === s7); // true
    console.log(s6 === s8); // true
    

      

    keyFor来查看你的Symbol有没在全局登记过:
    const s9 = Symbol('foo')
    const s10 = Symbol.for('foo')
    console.log(Symbol.keyFor(s9)); // undefined
    console.log(Symbol.keyFor(s10)); // foo
    

      

    应用场景:
     
    1、用Symbol保证对象的Key可以重名但是Key不相等,得到同时存在,
    例如一个对象里面保存班级同学的信息,但是很有可能班级有重名的情况
    const stu1 = Symbol('张三')
    const stu2 = Symbol('张三')
    const grade = {
        [stu1]: {
            address: 'aaa',
            tel: '111'
        },
        [stu2]: {
            address: 'bbb',
            tel: '222'
        },
    }
    console.log(grade);
    console.log(grade[stu1]);
    console.log(grade[stu2]);
    

      

    2、使用Symbol可以相对隐藏类的实例属性

    const sym = Symbol('age')
    class User {
        constructor(name) {
            this.name = name
            this[sym] = 18
        }
        getName() {
            console.log('getName:' + this.name + ' age:' + this[sym])
        }
    }
    
    const user = new User('张三')
    user.getName()
    // for in是读取不到sym属性
    for (let key in user) {
        console.log(key);
    }
    // keys读取不到sym属性
    for (let key of Object.keys(user)) {
        console.log(key);
    }
    // getOwnPropertySymbols只能读取Symbol属性
    for (let key of Object.getOwnPropertySymbols(user)) {
        console.log(key);
    }
    // Reflect.ownKeys既可以读取一般实例属性,也可以读取Symbol属性
    for (let key of Reflect.ownKeys(user)) {
        console.log(key);
    }
    

      

    3、消除魔术字符串

    什么是魔术字符串?如下代码:

    这里的aaa,bbb就是魔术字符串,需要来回编写,而且只要原方法修改,另外地方也要跟着修改
    function getArea(str) {
        let area = 0
        switch (str) {
            case 'aaa':
                area = 1
                break
            case 'bbb':
                area = 2
                break
        }
        return area
    }
    console.log(getArea('aaa'))
    

      

    使用对象来消除魔术字符串
    /* 
    const strType = {
        aaa: 'aaa',
        bbb: 'bbb',
    } 
    */
    // 由于上面value其实并不需要关心是什么字符串,所以可以用Symbol来代替
    const strType = {
        aaa: Symbol(),
        bbb: Symbol(),
    }
    
    function getArea2(str) {
        let area = 0
        switch (str) {
            case strType.aaa:
                area = 1
                break
            case strType.bbb:
                area = 2
                break
        }
        return area
    }
    console.log(getArea2(strType.aaa))
    

      

    放弃安逸,持续努力——成长
  • 相关阅读:
    javaee
    前后台页面跳转及参数传递
    easyu几个常见问题
    利用easyUI填充表格数据
    easyUI数据转换为不同级别的数据
    Java数据结构漫谈-Vector
    RxJava漫谈-RxAndroid使用
    Java数据结构漫谈-Stack
    Java性能漫谈-数组复制之System.arraycopy
    Java数据结构漫谈-LinkedList
  • 原文地址:https://www.cnblogs.com/MarsPGY/p/14827533.html
Copyright © 2020-2023  润新知