重學 ES6 Symbol

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值都是不想等的,這意味着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值。對象

相關文章
相關標籤/搜索