美文网首页
ES6新增的数据类型

ES6新增的数据类型

作者: 学的会的前端 | 来源:发表于2020-02-13 01:05 被阅读0次

    JS 数类型:

    • 基本数据类型:numberstringbooleannullundefinedSymbol(新增)
    • 复杂数据类型:object
      除了新增的Symbol之外,其他的SetMapWeakSetWeakMapTypeArray均为object

    Symbol

    静态属性和静态方法统称为静态成员,可以通过构造函数.直接调用。

    • Symbol()函数会返回Symbol类型的值,该类型的值具有静态属性和静态方法,但它不支持语法 new Symbol()
    a = window.Symbol()   //Symbol()是一个全局函数
    a //Symbol()
    
    • 每个从Symbol()返回的Symbol值都是唯一的;
    a = window.Symbol()
    b = window.Symbol()
    a === b //false
    
    • 一个Symbol的值能作为对象属性的标识符,在ES6之前,对象属性名只能是字符串.
    a = window.Symbol
    var obj = {}
    obj[a] = 'aaaaa'
    
    Symbol的值可以作为对象的属性名.PNG
    • Symbol是一种基本数据类型,不是对象。
    a = Symbol()
    typeof a //symbol
    
    • 在ES6之前,无法做到真正有一个私有属性,但是Symbol可以创造一个隐藏属性.
    {
      let a = Symbol()
      let obj = {
        name: 'aaaa',
        [a]: '隐藏' //不能写成a,这是字符串a
      }
      window.object = obj;
    }
    
    Symbol创造隐藏属性.PNG

    Set

    Set对象允许你存储任何类型的唯一值,无论是原始值还是对象引用。

    new Set([1,2,1,4,3,5,3,4])
    //Set(5) {1, 2, 4, 3, 5} //返回的是一个对象
    
    • 面试题,数组去重
    //ES5
    var a = [1, 2, 5, 4, 5, 3, 2, 1, 3];
    
    function uniq(array) {
      var result = [];
      var hash = {};
      for (var i = 0; i < array.length; i++) {
        hash[array[i]] = true; //把数组的值作为对象的key,存储起来,并且赋值true,相同的数值不进行多次处理
      }
      console.log(hash);
      for (let key in hash) {
        result.push(key); //把hash对象的key push到数组里
      }
      return result;
    }
    
    console.log(uniq(a)); //['1','2','3','4','5']
    
    /*
    缺点:
    1: 返回的新数组里面的数字不是真实的数字,是字符串数字,因为在ES6之前,对象的属性名只能是字符串
    2. 无法区别原数组中的数字和字符串数字,比如'4'和4,会被认为是一个
    3. 无法统计对象,比如[1,2,3,{name:object}] //返回的新数组是["1", "2", "3", "[object Object]"]
    */
    
    
    //ES6
    
    //set对象允许你存储任何类型的唯一值,无论是原始值或者是对象引用 
    
    var a = [1, 2, 5, 4, 5, "4", 3, 2, 1, 3, { name: "object" }]; 
    
     function uniq(array) { 
      return Array.from(new Set(array)); 
      //等价于[...new Set(array)] 
    } 
    //new Set(array)得到的是对象,所以Array.form将对象变为数组 
    console.log(uniq(a)); //[1, 2, 5, 4, "4", 3, {…}] 
    
    

    Map对象

    Map对象保存键值对,任何值(对象或者原始值)都可以作为一个键或一个值。
    Map对象最大的优点就是弥补了对象只能用自古城窜作为key的这一缺点,Map对象使得任何都可以作为key。

    var map = new Map()
    var a = {}
    map.set(a,'hi') //设置
    map.get(a)  //获取
    
    • 获取键值对里面的key
    for(let key of map.keys()){
      console.log(key)
    }
    
    • 获取键值对里的value
    for(let value of map.values()){
      cosnole.log(value)
    }
    
    • 获取每一对键值对
    for(let key of map.entries()){
      console.log(key)
    }
    

    WeakSet对象

    WeakSet对象允许你将弱引用保持对象存储在一个集合中,弱引用不属于GC(垃圾回收)的计算范围,即弱引用的属性依旧可以被回收。

    var Wset = new WeakSet()
    var o = {}
    Wset.add(o)
    o = null //可以被回收,Wset为弱引用
    
    var set = new Set()
    var o = {}
    set.add(o)
    o = null //不可以被回收,set为弱引用
    
    • WeakSet对象set对象的区别二:WeakSet对象不能获取到键值对,即没有entries

    WeakMap对象

    WeakMap对象是一组键值对的集合,其中键是弱引用,并且只能是对象,而值可以使任意值。

    • 区别:WeakMap对象不能获取到键值对,即没有entries

    相关文章

      网友评论

          本文标题:ES6新增的数据类型

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