美文网首页
Symbol的入门勘察

Symbol的入门勘察

作者: Mokingc | 来源:发表于2020-02-22 23:59 被阅读0次

    概念

    Symbol()函数会返回symbol类型的值,该类型具有静态属性和静态方法。它的静态属性会暴露几个内建的成员对象;它的静态方法会暴露全局的symbol注册,且类似于内建对象类,但作为构造函数来说它并不完整,因为它不支持语法:"new Symbol()"

    每个从Symbol()返回的symbol值都是唯一的。一个symbol值能作为对象属性的标识符;这是该数据类型仅有的目的。

    运用

    从上述定义中我们可以看出,Symbol的作用就是声明一个唯一的变量,纵使传入的参数一样,也不会使它们相等.

    let s1 = Symbol('foo')
    let s2 = Symbol('foo')
    
    s1 // Symbol(foo)
    s2 // Symbol(foo)
    
    s1.toString() // "Symbol(foo)"
    s2.toString() // "Symbol(foo)"
    
    s1 == s2    // false
    

    Symbol的参数只是一个描述,就好像俩个双胞胎,你无论如何相同的描述他们,他们也是俩个不同的人.世界上每个人都是独一无二的,而Symbol的作用正是声明一个独一无二的变量.

    那么为何ES6要出这么一个新类型呢,它的主要作用是什么呢?

    由于每一个 Symbol 值都是不相等的,这意味着 Symbol 值可以作为标识符,用于对象的属性名,就能保证不会出现同名的属性。这对于一个对象由多个模块构成的情况非常有用,能防止某一个键被不小心改写或覆盖

    举个例子,一个学校有俩个人,他们很像,如果使用字符串作为他们的描述传入.

    var Student = function(describe){
        this.describe = describe
    }
    
    var a = new Student("好学,认真,努力")
    var b = new Student("好学,认真,努力")
    
    a.describe == b.describe // true
    

    使用Symbol生成

    var Student = function(describe){
        this.describe = describe
    }
    
    var a = new Student(Symbol("好学,认真,努力"))
    var b = new Student(Symbol("好学,认真,努力"))
    
    a.describe == b.describe // false
    

    这里我举的这个例子可能不太恰当,因为 a 的描述确实和 b 的描述确实相同.只是想告诉大家,这里的Symbol起的是一个"ID"的作用,就像每个人的身份证一样,输入查询便能看到你的个人信息.

    下述借鉴阮一峰老师的例子:

    const COLOR_RED1    = Symbol("我是红色");
    const COLOR_RED2    = Symbol("我是红色");
    
    function getComplement(color) {
      switch (color) {
        case COLOR_RED1:
          return "中国红";
        case COLOR_RED2:
          return "玫瑰红";
        default:
          throw new Error('Undefined color');
        }
    }
    

    总结

    Symbol 的主要作用就是作为一个可替换字符串或者整型使用的唯一值.

    如果想更进一步了解,可以查看下面的参考链接:

    相关文章

      网友评论

          本文标题:Symbol的入门勘察

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