Symbol的入门勘察

2020-02-22  本文已影响0人  Mokingc

概念

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 的主要作用就是作为一个可替换字符串或者整型使用的唯一值.

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

上一篇下一篇

猜你喜欢

热点阅读