美文网首页
ES6 - Symbol

ES6 - Symbol

作者: 恒星的背影 | 来源:发表于2018-10-04 19:46 被阅读0次

    是一种新的原始数据类型
    可以作为对象的 key,保证属性名不会发生冲突

    创建 Symbol:

    let s = Symbol();
    

    Symbol 函数可以接受一个字符串作为参数,表示对 Symbol 实例的描述,主要是为了在控制台显示,或者转为字符串时,比较容易区分。

    let s1 = Symbol('foo');
    s1 // Symbol(foo)
    s1.toString() // "Symbol(foo)"
    

    Symbol 类型还可以用于定义一组常量,保证这组常量的值都是不相等的

    实例:消除魔术字符串

    const shapeType = {
      triangle: Symbol()
    };
    
    function getArea(shape, options) {
      let area = 0;
      switch (shape) {
        case shapeType.triangle:
          area = .5 * options.width * options.height;
          break;
      }
      return area;
    }
    
    getArea(shapeType.triangle, { width: 100, height: 100 });
    

    属性名的遍历

    Symbol 作为属性名,该属性不会出现在 for...in、for...of 循环中,也不会被 Object.keys() 等方法返回
    Object.getOwnPropertySymbols 方法,可以获取指定对象的所有 Symbol 属性名

    Symbol.for(),Symbol.keyFor()

    Symbol.for() 接受一个字符串作为参数,然后搜索有没有以该参数作为名称的 Symbol 值。如果有,就返回这个 Symbol 值,否则就新建并返回一个以该字符串为名称的 Symbol 值。

    let s1 = Symbol.for('foo');
    let s2 = Symbol.for('foo');
    
    s1 === s2 // true
    

    Symbol.keyFor() 方法返回一个已登记的 Symbol 类型值的key。

    let s1 = Symbol.for("foo");
    Symbol.keyFor(s1) // "foo"
    
    let s2 = Symbol("foo");
    Symbol.keyFor(s2) // undefined
    

    内置的 Symbol 值

    Symbol.hasInstance 
    指向一个内部方法。当其他对象使用instanceof运算符,判断是否为该对象的实例时,会调用这个方法
    Symbol.isConcatSpreadable
    Symbol.species 
    Symbol.match 
    Symbol.replace 
    Symbol.search
    Symbol.split 
    Symbol.iterator 
    Symbol.toPrimitive
    Symbol.toStringTag
    Symbol.unscopables
    

    相关文章

      网友评论

          本文标题:ES6 - Symbol

          本文链接:https://www.haomeiwen.com/subject/vemxaftx.html