ES6 — Map和Set

1、Map

map和object的区别:

  • 一个 Object 的键只能是字符串或者 Symbols,但一个 Map 的键可以是任意值
  • Map 中的键值是有序的(FIFO 原则),而添加到对象中的键则不是。
  • Map 的键值对个数可以从 size 属性获取,而 Object 的键值对个数只能手动计算。
  • Object 都有自己的原型,原型链上的键名有可能和你自己在对象上的设置的键名产生冲突。

一个Map的key(也就是键)可以是字符串、对象、函数和NaN等。通过set()函数设置键值对,通过get(key)函数获取键(key)对应的值。

例子:

let map = new Map();
map.set("name","Lamb");
console.log(map.get("name"));//Lamb

  

Map的迭代:

Map的常用方法:

  1. entries():返回一个新的 Iterator 对象,它按插入顺序包含了 Map 对象中每个元素的 [key, value] 数组。
  2. keys():返回一个新的 Iterator 对象, 它按插入顺序包含了 Map 对象中每个元素的键(key)。
  3. values(): 返回一个新的 Iterator 对象,它按插入顺序包含了 Map 对象中每个元素的值 (value)。

使用for……of……遍历Map

let map = new Map();
map.set(1,"one");
map.set(2,"two");
map.set(3,"three");

for( var [k,v] of map ){ //数组解构赋值!
  console.log("key = "+ k +" value = "+v);
}
/*
key = 1 value = one
key = 2 value = two
key = 3 value = three
*/
for( var [k,v] of map.entries() ){ //数组解构赋值!
  console.log("key = "+ k +" value = "+v);
}
/*
key = 1 value = one
key = 2 value = two
key = 3 value = three
*/
for(var k of map.keys()){
  console.log("key = "+k);
}
/*
key = 1
key = 2
key = 3
*/
for(var v of map.values()){
  console.log("value = "+v);
}
/*
value = one
value = two
value = three
*/

  

使用forEach()函数:

var myMap = new Map();
myMap.set(0, "zero");
myMap.set(1, "one");

// 将会显示两个 logs。 一个是 "0 = zero" 另一个是 "1 = one"
myMap.forEach(function(value, key) {
  console.log(key + " = " + value);
});

  

Map与Array(二维键值对数组)互相转换:

var kvArray = [["key1", "value1"], ["key2", "value2"]];
 
// Map 构造函数可以将一个 二维 键值对数组转换成一个 Map 对象
var myMap = new Map(kvArray);
 
// 使用 Array.from 函数可以将一个 Map 对象转换成一个二维键值对数组
var outArray = Array.from(myMap);

  

Map合并:

var first = new Map([[1, 'one'], [2, 'two'], [3, 'three'],]);
var second = new Map([[1, 'uno'], [2, 'dos']]);
 
// 合并两个 Map 对象时,如果有重复的键值,则后面的会覆盖前面的,对应值即 uno,dos, three
var merged = new Map([...first, ...second]);

  

2、Set(集合)

数学中集合的性质:

①明确性,即那些元素是属于这个集合的,那些元素不属于这个集合是明确的;

②无序性,元素之间是没有顺序的{0,1}={1,0};

③互异性,集合中的元素互不相同。

通过add()函数向集合中添加数据。

let mySet = new Set();
 
mySet.add(1); // Set(1) {1}
mySet.add(5); // Set(2) {1, 5}
mySet.add(5); // Set(2) {1, 5} 这里体现了值的唯一性
mySet.add("some text"); 
// Set(3) {1, 5, "some text"} 这里体现了类型的多样性
var o = {a: 1, b: 2}; 
mySet.add(o);
mySet.add({a: 1, b: 2}); 
// Set(5) {1, 5, "some text", {…}, {…}} 
// 这里体现了对象之间引用不同不恒等,即使值相同,Set 也能存储

  

记录

  "..."的用法:展开语法(Spread syntax), 可以在函数调用/数组构造时, 将数组表达式或者string在语法层面展开;还可以在构造字面量对象时, 将对象表达式按key-value的方式展开。(译者注: 字面量一般指 [1, 2, 3] 或者 {name: "mdn"} 这种简洁的构造方式)。

let array = [1,2,3,4];
console.log(...array);
//1 2 3 4

  

posted @ 2021-09-24 19:05  小绵杨Lamb  阅读(101)  评论(0)    收藏  举报