1、定義
symbol類型是新的原始數據類型,表示獨一無二的值,其餘的原始數據類型還有Number,String,Boolean,Null,Undefined;Object屬於複雜數據類型。函數
2、參數code
一、Symbol函數接受字符串做爲參數,控制檯輸出時,比較容易區分。orm
二、Symbol函數的參數僅表示Symbol值得描述,相同的參數返回值也不同對象
var a = Symbol('a'); var b = Symbol('a'); a === b //false
三、Symbol.for()能夠生成同一個Symbol值。字符串
請輸入代碼
var a = Symbol.for('a'); var b = Symbol.for('a'); a === b //true
Symbol.for()生成的名字是全局環境的,能夠在不一樣的iframe中給取到值。get
3、Symbol值做爲對象
一、Symbol值做爲屬性名時不能使用點運算
二、定義屬性時,必須放在方括號內,與普通鍵值進行區分。iframe
var a = Symbol('a'); var obj = { a: 'normal key', [a]: 'symbol key' }
三、Symbol值定義的屬性屬於公開屬性,普通方法沒法遍歷。io
//如上例 Obj.getOwnProperty() //['a'] Obj.getOwnPropertySymbols() //[Symbol('a')] Refelect.ownKeys() // ['a', Symbol('a')]
四、利用Symbol的特性可定義內部私有屬性或方法console
function getObj (obj) { let privateKey = symbol('privateKey'), objCopy = ...obj || {}; objCopy[privateKey] = function privateFunc () { console.log('privateFunc ') } return objCopy; } let newObj = getObj(); newObj[privateKey] // 報錯,外部沒法獲取到privateKey的值 newObj[symbol('privateKey')] //undefined,此時的symbol已經變成新的symbol值
3、注意點
一、Symbol值不能進行隱式轉換,所以它與其餘類型的值進行運算,會報錯。function
二、Symbol值可顯示地轉換成字符串。
var a = Symbol('a'); a.toString() // 'Symbol(a)'
三、能夠顯示或隱式轉成Boolen,卻不能轉成數值。
var a = Symbol('a'); Boolean(a) //true if (a) { console.log(a); } //Symbol('a') 打印出來地Symbol值會帶上參數,便於區分