ES 6 引入了一個新的數據類型 Symbol,它是用來做什么的呢?
為了說明 Symbol 的作用,我們先來描述一個使用場景。
我們在做一個游戲程序,用戶需要選擇角色的種族。
var race = { protoss: 'protoss', // 神族 terran: 'terran', // 人族 zerg: 'zerg' // 蟲族 } function createRole(type){ if(type === race.protoss){創建神族角色} else if(type === race.terran){創建人族角色} else if(type === race.zerg){創建蟲族角色} }
那么用戶選擇種族后,就需要調用 createRole 來創建角色:
// 傳入字符串 createRole('zerg') // 或者傳入變量 createRole(race.zerg)
一般傳入字符串被認為是不好的做法,所以使用 createRole(race.zerg) 的更多。
如果使用 createRole(race.zerg),那么聰明的讀者會發現一個問題:race.protoss、race.terran、race.zerg 的值為多少並不重要。
改為如下寫法,對 createRole(race.zerg) 毫無影響:
var race = { protoss: 'askdjaslkfjas;lfkjas;flkj', // 神族 terran: ';lkfalksjfl;askjfsfal;skfj', // 人族 zerg: 'qwieqwoirqwoiruoiwqoisrqwroiu' // 蟲族 }
也就是說:
race.zerg 的值是多少無所謂,只要它的值跟 race.protoss 和 race.terran 的值不一樣就行。
Symbol 的用途就是如此:Symbol 可以創建一個獨一無二的值(但並不是字符串)。
用 Symbol 來改寫上面的 race:
var race = { protoss: Symbol(), terran: Symbol(), zerg: Symbol() } race.protoss !== race.terran // true race.protoss !== race.zerg // true
你也可以給每個 Symbol 起一個名字:
var race = { protoss: Symbol('protoss'), terran: Symbol('terran'), zerg: Symbol('zerg') }
不過這個名字跟 Symbol 的值並沒有關系,你可以認為這個名字就是個注釋。如下代碼可以證明 Symbol 的名字與值無關:
var a1 = Symbol('a') var a2 = Symbol('a') a1 !== a2 // true
如果你覺得我說得還是太復雜了,看不懂,你可以記一句話:
Symbol 生成一個全局唯一的值。