zoukankan      html  css  js  c++  java
  • 一种新的数据类型Symbol

    symbol 是一种基本数据类型 (primitive data type)。Symbol()函数会返回symbol类型的值,该类型具有静态属性和静态方法。它的静态属性会暴露几个内建的成员对象;它的静态方法会暴露全局的symbol注册,且类似于内建对象类,但作为构造函数来说它并不完整,因为它不支持语法:"new Symbol()"。每个从Symbol()返回的symbol值都是唯一的。一个symbol值能作为对象属性的标识符;这是该数据类型仅有的目的。

    他是一个新的基本数据类型并且为唯一值

    let s1 = Symbol()
    let s2 = Symbol()
    console.log(s1);
    console.log(s1===s2); // false
    

    symbol 会自动调用原型中的toString方法

    const obj = {
      name: 'es6',
      toString () {
        return this.name
      }
    }
    let s = Symbol(obj)
    console.log(s) // 输出es6
    

    API

    Symbol.for() 会去寻找是否声明过,如果已声明将会指向同一个,否则注册一个Symbol

    let s1 = Symbol('foo')
    let s2 = Symbol('foo')
    console.log(s1===s2) // true
    

    Symbol.keyFor() 返回一个已经注册的 Symbol

    const s1 = Symbol('foo')
    console.log(Symbol.keyFor(s1));  // undefined
    
    const s2 = Symbol.for('foo')
    console.log(Symbol.keyFor(s2));  // foo
    

    应用场景

    1. 当对象中需存入两个键名相同的键值对时(例如姓名相同的人),可使用Symbol来区分.
    const stu1 = Symbol('李四')
    const stu2 = Symbol('李四')
    
    const grade = {
       [stu1]: {
         address: 'xxx',
         tel:'1111'
       },
       [stu2]: {
         address: 'xxx',
         tel:'22222'
       }
     }
     
    console.log(grade); // 并没有被覆盖掉
    console.log(grade[stu2]); // {address: 'xxx',tel:'22222'}
    
    1. 可以对对象进行封装, 类似于隐藏属性, 通过for in遍历不出, 通过let key of Reflect.ownKeys(obj) 可以遍历出
    const sym = Symbol('es5')
    class User {
      constructor(name) {
        this.name = name
        this[sym] = 'es6'
      }
      getName () {
        return this.name + ' ' + this[sym]
      }
    }
    const user = new User('es5')
    console.log(user.getName()); // es5 es6
    
    for (let key in user) {
       console.log(key);
    } // name
    
    for (let key of Object.getOwnPropertySymbols(user)) {
      console.log(key);
    } // name Symbol(es5)
    
    1. 消除魔术字符串

    魔术字符串指的是,在代码之中多次出现、与代码形成强耦合的某一个具体的字符串或者数值。风格良好的代码,应该尽量消除魔术字符串,改由含义清晰的变量代替。

    function getArea (shape) {
      let area = 0
      switch (shape) {
        case 'Triangle': 
          area = 1
          break
        case 'Circle': 
          area = 2
          break
      }
      return area
    }
    
    console.log(getArea('Triangle')); //1
    

    使用Symbol()的唯一性代替原来'Triangle',代码看起来更加清晰,减少出错率

    const shapeType = {
      triangle: Symbol(),
      circle: Symbol()
    }
    function getArea (shape) {
      let area = 0
      switch (shape) {
        case shapeType.triangle: 
          area = 1
          break
        case shapeType.circle: 
          area = 2
          break
      }
      return area
    }
    console.log(getArea(shapeType.circle)); // 2
    
  • 相关阅读:
    语文作业
    在Windows下为PHP5.5安装redis扩展
    PHP安全处理之Mcrypt使用总结
    CSS3 动画
    微信开发--获取用户openID
    微信公众号开发--获取用户信息
    php 中gd库的安装
    随机输入几个数,输出重复的数字和重复的次数
    永久解决"Error:java: 错误: 不支持发行版本 12"的问题
    报"java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing"的原因和如何处理
  • 原文地址:https://www.cnblogs.com/pamela1226/p/13300253.html
Copyright © 2011-2022 走看看