概念
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
的主要作用就是作为一个可替换字符串或者整型使用的唯一值.
如果想更进一步了解,可以查看下面的参考链接: