概念
Symbol()
函數(shù)會返回symbol
類型的值嫉嘀,該類型具有靜態(tài)屬性和靜態(tài)方法稼跳。它的靜態(tài)屬性會暴露幾個內(nèi)建的成員對象;它的靜態(tài)方法會暴露全局的symbol
注冊吃沪,且類似于內(nèi)建對象類,但作為構(gòu)造函數(shù)來說它并不完整什猖,因為它不支持語法:"new Symbol()"
票彪。
每個從Symbol()
返回的symbol
值都是唯一的。一個symbol
值能作為對象屬性的標(biāo)識符不狮;這是該數(shù)據(jù)類型僅有的目的降铸。
運用
從上述定義中我們可以看出,Symbol
的作用就是聲明一個唯一的變量,縱使傳入的參數(shù)一樣,也不會使它們相等.
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
的參數(shù)只是一個描述,就好像倆個雙胞胎,你無論如何相同的描述他們,他們也是倆個不同的人.世界上每個人都是獨一無二的,而Symbol
的作用正是聲明一個獨一無二的變量.
那么為何ES6
要出這么一個新類型呢,它的主要作用是什么呢?
由于每一個 Symbol
值都是不相等的,這意味著 Symbol
值可以作為標(biāo)識符摇零,用于對象的屬性名推掸,就能保證不會出現(xiàn)同名的屬性。這對于一個對象由多個模塊構(gòu)成的情況非常有用驻仅,能防止某一個鍵被不小心改寫或覆蓋谅畅。
舉個例子,一個學(xué)校有倆個人,他們很像,如果使用字符串作為他們的描述傳入.
var Student = function(describe){
this.describe = describe
}
var a = new Student("好學(xué),認(rèn)真,努力")
var b = new Student("好學(xué),認(rèn)真,努力")
a.describe == b.describe // true
使用Symbol
生成
var Student = function(describe){
this.describe = describe
}
var a = new Student(Symbol("好學(xué),認(rèn)真,努力"))
var b = new Student(Symbol("好學(xué),認(rèn)真,努力"))
a.describe == b.describe // false
這里我舉的這個例子可能不太恰當(dāng),因為 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');
}
}
總結(jié)
Symbol
的主要作用就是作為一個可替換字符串或者整型使用的唯一值.
如果想更進一步了解,可以查看下面的參考鏈接: