【深入淺出ES6】Symbol

Eric_zhang發表於2019-03-04

【深入淺出ES6】Symbol

意義

Symbol是JS新引入的一個基本型別,拓寬了定義物件屬性的型別(傳統的物件是所有屬性都是字串,如今新增了symbol型別的屬性),同時定義物件屬性是不可列舉,通過Object.keys()\Object.getOwnPropertyNames()兩種方法是訪問不到物件的symbol型別屬性的,使得物件屬性及值的訪問更加的安全

使用

  1. 使用全域性Symbol函式建立symbol型別
let firstName = Symbol('first name') //傳入的引數作為symbol變數的描述
let person = {}
person[firstName] = 'Tom'
console.log(person) // {Symbol(first name): "Tom"}
console.log(person[firstName]) // 'Tom'
console.log(firstName) // Symbol('first name') symbol變數的描述資訊儲存在內部屬性[[Description]]中,只有顯式或隱式的呼叫toSting()時,會被讀取到,console.log()會隱式的呼叫toString()方法,所以才列印出來了;String(firstName) 也會隱式呼叫toSting()、firstName.toString()則是顯式呼叫
console.log('first name' in person) // false  'first name'只是symbol變數的描述資訊而已
複製程式碼

注:symbol變數最大的特點是不會被轉換成字串和數字型別,所以也就保證了symbol值的唯一性和安全性

  1. ES6新定義的Object.getOwnPropertySymbols()檢索symbol型別的物件屬性 Object.keys()\Object.getOwnPropertyNames()兩種方法是訪問不到物件的symbol型別屬性

結尾

由於目前使用的場景還不多,所以這裡不贅述過多,感興趣的同學可以去網上查查更多的用法