JS Map Set and iterable

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_38842522/article/details/85216564

JS Map Set and iterable

Map

  • js默认的对象表示方式{}可以看作其它语言中的Map和Dictionary的数据结构,一组键值对
  • js对象的键必须是字符串,实际上Number和其它数据类型也是非常合理的
  • es6规范引入了新数据类型Map
  • 定义
var m = new Map(['Michael', 95], ['Bob', 75], ['Tracy', 85]);
m.get('Michael'); // 95
  • Map需要一个名字成绩对照表,根据名字查成绩,无论表多大,查找速度都是非常快的
  • 初始化需要一个二位数组或者空Map
var m = new Map()
m.set('Adam', 67); //add a new key-value
m.has('Adma'); // has or has not a key
m.delete('Adam'); // delete the key
m.get('Adam'); // get the value
  • 一个键只对应一个值,所以后边的值会把前面的值冲掉

Set

  • 与Map类似,是一组key的集合,但不存储value,没有重复的元素
  • 创建Set,需要提供一个Array,或者一个空Set
var s1 = new Set(); // empty Set
var s2 = new Set([1, 2, 3]); // 包含1 2 3
  • Set应用场景
    • 丢弃重复注册的监听器: Set数据唯一
    • 监听器按顺序调用: Set按插入顺序遍历
    • 调用所有监听器: Set遍历跟数组差不多快
    • 经常添加/删除: Set添加/删除都很快
    • 所以Set对应的是数组,而不是对象。

iterable

  • Map 和 Set无法使用下表循环,为了统一集合类型,es6引入了新的iterable类型,Array、Map、和Set都属于iterable类型,可以用for…of来遍历
  • for…in遍历的实际上是对象的属性名称,数组实际上也是一个对象,它每个元素的索引都被视为一个属性,for…of只循环集合本身类型的元素
  • 更好的方法是使用iterable内置的forEach方法,接受一个函数,每次迭代自动回调该函数
var a = ['a', 'b', 'c'];

a.forEach(function(element, index, array) {
    console.log(element + ', index = ' + index);
});
  • Set于Array类似,但是Set没有索引,因此回调函数前两个参数都是键本身。
  • Map的回调函数依次为value key map
var m = new Map([1, 'x'], [2, 'y'], [3, 'z']);
m.forEach(function(value, key, map) {
    console.log(value);
}); // 输出 x y z;

猜你喜欢

转载自blog.csdn.net/weixin_38842522/article/details/85216564