10Symbol

作者: 我_巨可爱 | 来源:发表于2017-10-30 16:57 被阅读0次

    概述

    1. Symbol 是一种新的数据类型
    2. nullundefined 等六种类型并列。typeof的结果是symbol
    3. 使用Symbol()创建的值,独一无二,与标识相同的symbol值也不同,没有登记机制
    4. 不能与其他类型进行运算,拼接也不行
    5. 显式转化成字符串
    6. 可以转化成布尔类型
    7. 不可以转化成数值类型

    作为属性名的Symbol

    var mySymbol = Symbol();
    var a = {
        [mySymbol] : 'hello!'
    }
    // 只能用这种方式
    a[mySymbol]
    

    消除魔术字符串

    魔术字符串,指的是在代码中多次出现,并且与代码形成强耦合的具体字符串或者数值

    1. 其实这个案例是作为属性值的Symbol
    const shapgeType = {
        triangle: Symbol()
    };
    function () {
        // 只要 shapgeType 有属性即可,不需要属性值
    }
    

    属性名的遍历

    1. Symbol作为属性名,不会出现在
    • for in
    • for of
    • object.keys()
    • object.getOwnPropertyNames()
    • JSON.stringify()
    1. 可以通过以下方法获取
    • object.getOwnPropertySymbols(),返回一个数组
    • Reflect.ownKeys可以返回所有里类型的键名,包含常规键名和Symbol键名

    Symbol.for()Symbol.keyFor()

    1. Symbol.for()相当于进行了登记
    2. Symbol.keyFor()可以找到登记的Symbol
    3. 登记的Symbol是全局环境的,跨越iframe
    // 不登记的情况
    var s1 = Symbol('hi');
    var s2 = Symbol('hi');
    s1 === s2; // false
    
    // 登记的情况
    var s1 = Symbol.for('hi');
    var s2 = Symbol.for('hi');
    s1 === s2; // true
    

    内置的 Symbol

    ES6 内置了11个Symbol值,可以与一些方法结合使用。

    1. Symbol.hasInstanceinstanceof
    2. Symbol.isConcatSpreadable 和 数组的concat方法
    3. Symbol.matchstr.match()
    4. Symbol.iterator指向对象的默认遍历器方法
    5. 还有很多
    // 对象进行 for of 循环时,会调用 Symbol.iterator 方法
    

    相关文章

      网友评论

          本文标题:10Symbol

          本文链接:https://www.haomeiwen.com/subject/eecmpxtx.html