ES6 引入了一種新的原始數據類型 Symbol,表示獨一無二的值。是JavaScript第7種原始數據類型。前6種是:undefined,Null,Boolean,String,Number,Object。javascript
Symbol值,經過Symbol函數生成。也就是說,對象的屬性名如今有兩種類型,一種是原來就有的字符串,另外一種就是新增的Symbol類型。只要屬性名屬於Symbol類型,就是獨一無二的,能夠保證不會與其餘屬性名產生衝突。java
let s = Symbol();
typeof s // symbol
複製代碼
Symbol 函數錢不能使用 new ,Symbol不是對象,因此,也不能添加屬性。基本上,他是一種相似於字符串的數據類型。數組
因爲每個Symbol值都是不想等的,這意味着Symbol值能夠做爲標識符用於對象的屬性名,保證不會出現同名屬性。對於一個對象由多個模塊構成的狀況很是有用,能防止某一個鍵被不當心修改或者覆蓋。函數
var mySymbol = Symbol();
// 第一種寫法
var a = {};
a[mySymbol] = 'Hello';
// 第二種寫法
var a = {
[mySymbol]:'Hello';
}
// 第三種寫法
var a = {};
Object.defineProperty(a,mySymbol,{value:'Hello'});
複製代碼
在對象內部,使用Symbol值定義屬性時,Symbol值必須放在方括號中。ui
function getArea(shape,options){
var area = 0;
switch (shape) {
case: 'Trangle'://魔術字符串
area = 0.5 * options.width * options.height;
break;
/* more */
}
return area;
}
getArea('Trangle', {width:100,height:100}); //魔術字符串
複製代碼
字符串 Trangle 就是一個 魔術字符串。屢次出現,與代碼強耦合。不利於未來的修改和維護。spa
經常使用的消除魔術字符串的方法就是將其寫成一個變量code
var shapeType = {
triangle: 'Trangle'
}
function getArea(shape,options){
var area = 0;
switch (shape) {
case: shapeType.trangle://魔術字符串
area = 0.5 * options.width * options.height;
break;
/* more */
}
return area;
}
getArea(shapeType.trangle, {width:100,height:100});
複製代碼
Symbol 做爲屬性名,該屬性不會出如今 for .. in , for ... of 循環中,也不會被 Object.keys(),Object.getOwnPropertyNames()返回。可是它也不是私有屬性。有一個Object.getOwnPropertySymbols方法返回指定對象的全部symbol屬性名,是一個數組,成員是當前對象全部用做屬性名的Symbol值。對象