zoukankan      html  css  js  c++  java
  • javascript Map和Set

    Map和Set

      JavaScript的默认对象表示方式{}可以视为其他语言中的MapDictionary的数据结构,即一组键值对。

      但是JavaScript的对象有个小问题,就是键必须是字符串。但实际上Number或者其他数据类型作为键也是非常合理的。

      最新的ES6规范引入了新的数据类型Map
      测试是否支持该属性:
      var m = new Map();
      var s = new Set();
      if(m && s){
        
    alert('你的浏览器支持Map和Set!');
      }
      var m = new Map([['Michael', 95], ['Bob', 75], ['Tracy', 85]]);
      m.get('Michael'); // 95

      初始化Map需要一个二维数组,或者直接初始化一个空MapMap具有以下方法:


      var m = new Map(); // 空Map
      m.set('Adam', 67); // 添加新的key-value
      m.has('Adam'); // 是否存在key 'Adam': true
      m.get('Adam'); // 67
      m.delete('Adam'); // 删除key 'Adam'
      由于一个key只能对应一个value,所以,多次对一个key放入value,后面的值会把前面的值冲掉:
      var m = new Map();
      m.set('Adam', 67);
      m.set('Adam', 88);
      m.get('Adam'); // 88

    Set

      SetMap类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在Set中,没有重复的key

      要创建一个Set,需要提供一个Array作为输入,或者直接创建一个空Set
      var s1 = new Set(); // 空Setvar s2 = new Set([1, 2, 3]); // 含1, 2, 3
      重复元素在Set中自动被过滤:
     
      var s = new Set([1, 2, 3, 3, '3']);
      s; // Set {1, 2, 3, "3"}数字3和字符串'3'是不同的元素。
      s.add(4)
      delete(key)方法可以删除元素:

    iterable

      遍历Array可以采用下标循环,遍历MapSet就无法使用下标。为了统一集合类型,ES6标准引入了新的iterable类型,ArrayMapSet都属于iterable类型。
      用for ... of循环遍历集合,用法如下
     
      var a = ['A', 'B', 'C'];
      for (var x of a) { // 遍历Array
          alert(x);//A B C
      }
     
     
     
      var s = new Set(['A', 'B', 'C']);
      for (var x of s) { // 遍历Set
           alert(x);
      }
      var m = new Map([[1, 'x'], [2, 'y'], [3, 'z']]);
      for (var x of m) { // 遍历Map
          alert(x[0] + '=' + x[1]);  //1=x  2=y  3=z
      }
      for ... in循环将把name包括在内,但Arraylength属性却不包括在内
      var a = ['A', 'B', 'C'];
      a.name = 'Hello';
      for (var x in a) {   
        alert(x); // '0', '1', '2', 'name'
      }

      for ... of循环则完全修复了这些问题,它只循环集合本身的元素:

      var a = ['A', 'B', 'C'];
      a.name = 'Hello';
      for (var x of a) {
          alert(x); 'A', 'B', 'C'
      }
      更好的方式是直接使用iterable内置的forEach方法,它接收一个函数,每次迭代就自动回调该函数(forEach()方法是ES5.1标准引入的,你需要测试浏览器是否支持。)
      var a = ['A', 'B', 'C'];
      a.forEach(function(element, index, array) {// element: 指向当前元素的值// index: 指向当前索引// array: 指向Array对象本身
          alert(element);// A  B   C
      });
      SetArray类似,但Set没有索引,因此回调函数的前两个参数都是元素本身:
      var s = new Set(['A', 'B', 'C']);
      s.forEach(function(element, sameElement, set) {
          alert(element);// A  B   C
      });
      Map的回调函数参数依次为valuekeymap本身:
        var m = new Map([[1, 'x'], [2, 'y'], [3, 'z']]);
        m.forEach(function(value, key, map) {
            alert(value);//x  y  z
        });
      由于JavaScript的函数调用不要求参数必须一致,因此可以忽略它们。例如,只需要获得Arrayelement
     
      var a = ['A', 'B', 'C'];
      a.forEach(function(element) {
          alert(element);
      });

     这是看廖雪峰的js写的,感觉挺好的,就记录了下来

  • 相关阅读:
    小白的进阶之路7
    小白的进阶之路6
    小白的进阶之路5
    小白的进阶之路4
    小白的进阶之路3
    小白的进阶之路2
    小白的进阶之路1
    02CSS布局13
    02css定位12
    02css盒子模型11
  • 原文地址:https://www.cnblogs.com/liuwanqiu/p/5447144.html
Copyright © 2011-2022 走看看