ES6 symbol類型詳解

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值會帶上參數,便於區分
相關文章
相關標籤/搜索