美文网首页
Symbol 基础

Symbol 基础

作者: 示十 | 来源:发表于2020-01-16 18:00 被阅读0次

    Symbol 是基本数据类型。表示独一无二的值。

    我们已经知道的原始数据类型还有哪些?

    基本数据类型:
    Boolean
    Number
    String
    Undefined
    Null
    
    复杂数据类型:
    Object
    

    Symbol 值通过 Symbol 函数直接生成,不能使用 new

    let s = Symbol();
    
    console.log(typeof s); // symbol
    

    不能使用 new 命令,否则会报错,这是因为 Symbol 是一个原始类型的值,不是对象,所以也不能添加对象

    给 symbol 值添加描述

    下面我们声明两个 symbol 值

    let s1 = Symbol();
    let s2 = Symbol();
    console.log(s1); // Symbol()
    console.log(s2); // Symbol()
    

    可以看到打印出来都是 Symbol(),那么为了区分二者,可以为其添加描述,这样就比较清晰了:

    let s1 = Symbol('foo');
    let s2 = Symbol('bar');
    console.log(s1); // Symbol(foo)
    console.log(s2); // Symbol(bar)
    

    symbol 值天生不相等

    上面可以明显看到 s1 和 s2 表示的值是不同的

    由于 symbol 参数只是对当前 Symbol 值的描述,所以,即使相同参数的 Symbol 值也是不相等的:

    let s1 = Symbol('foo');
    let s2 = Symbol('foo');
    console.log(s1 === s2); // false
    

    如何保证 symbol 值相等

    如果我们就像让两个 symbol 值相等呢?

    使用 Symbol.for() 语法可以保证两个 symbol 值相等:

    const s1 = Symbol.for('foo');
    const s2 = Symbol.for('foo');
    console.log(s1 === s2); // true
    

    原理: Symbol.for('foo') 会在全局环境下注册一个 key 为 foo 的 symbol 值,当再次使用 Symbol.for('foo') 语法创建 symbol 值的时候,会在全局环境中检索查找有没有登记过 key 为 foo 的 symbol 值,如果有,则返回该值,如果没有则创建一个新的值

    由于 Symbol() 没有登记机制,所以每次调用都会返回不同的值

    使用 Symbol.keyfor() 返回一个已登记的 Symbol 类型值的 key

    const s1 = Symbol.for('foo');
    const key = Symbol.keyFor(s1);
    console.log(key); // foo
    

    symbol 值的运算

    symbol 值只能参与字符串(需要强行转换为 string)、布尔值的运算

    let s1 = Symbol('foo');
    console.log(`this is a symbol: ${s1.toString()}, and convert to Boolean: ${!!s1}`); // this is a symbol: Symbol(foo), and convert to Boolean: true
    <!--或者强转-->
    console.log(`this is a symbol: ${String(s1)}, and convert to Boolean: ${Boolean(s1)}`); // this is a symbol: Symbol(foo), and convert to Boolean: true
    

    遍历 symbol

    const s1 = Symbol('foo');
    const s2 = Symbol('foo');
    
    let obj = {}
    obj.s1 = 'hello';
    obj[s1] = 'nihao';
    obj[s2] = 'neihou';
    
    console.log(obj);
    // s1: "hello"
    // Symbol(foo): "nihao"
    // Symbol(foo): "neihou"
    

    通过下列两个方法可以遍历出 Symbol 值

    • Object.getOwnPropertySymbols()
    • Reflect.ownKeys()
    const objKey = Object.getOwnPropertySymbols(obj);
    const objKey = Reflect.ownKeys(obj); // ["s1", Symbol(foo), Symbol(foo)]
    console.log(objKey); //[Symbol(foo), Symbol(foo)]
    

    作用

    • 作为属性名,不能用点运算符,只能用方括号([])
    • 定义常量

    相关文章

      网友评论

          本文标题:Symbol 基础

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