重学 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值。对象

相关文章
相关标签/搜索