JS 中的 Symbol 是什么?


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 生成一個全局唯一的值。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM