css

头像
李雍
    阅读 2 分钟

    ES6一个名不见经传的Symbol()方法

    symbol的中文意思是:符号;象征;标志;记号等。

    说到JavaScript原生数据类型,我们通常想到的有这6种:undefined、null、boolean、string、number、object。而symbol是ES6新增的一个原生数据类型。

    typeof Symbol();
    

    而Symbol本身又是一个方法。

    但Symbol不能作为构造函数使用。

    new Symbol();
    

    只有一个目的——作为对象属性的唯一标识符,防止对象属性冲突发生。
    因为Symbol()返回值是唯一的,也就是:

    Symbol('description') === Symbol('description');    // 返回值是false
    
    
    let info1 = {
       name: '小明',
       age: 24,
       job: '公司前台',
       [Symbol('description')]: '喜欢游泳'
    }
    let info2 = {
       [Symbol('description')]: '热情似火'
    }
    
    let target = {};
    Object.assign(target, info1, info2);
    

    我们可以使用Object.getOwnPropertySymbols(obj)这个方法进行获取

    Symbol在和对象使用的时候,往往离不开JS中的数组括号[],例如:
    
    var smy = Symbol();
    var info = {
      smy: 'x',
      [smy]: 'y'
    };
    此时:
    
    console.log(info.smy);       // 输出'x'
    console.log(info['smy']);    // 输出'x'
    console.log(info[smy]);      // 输出'y'
    

    可以添加属性的

    var smy = Symbol();
    smy.description = '描述';
    
    

    Symbol值可以显式转为字符串,也可以转为布尔值,但是不能转为数值

    var smy = Symbol();
    => +smy

    隐式地创建一个新的string类型的属性名也会报错,例如Symbol("foo") + "bar" 将抛出一个TypeError

    使用宽松相等时, Object(sym) == sym返回值是true。注意这里外面套的是Object();

    Symbols在for...in迭代中不可枚举,如果想要达到效果,借助Object.getOwnPropertySymbols(obj)这个方法。

    当使用JSON.strIngify()时以symbol值作为键的属性会被完全忽略,示意代码:

    JSON.stringify({[Symbol("foo")]: "foo"});    // '{}'      
    
    

    李雍
    0 声望0 粉丝