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的常用方法:
- entries():返回一个新的 Iterator 对象,它按插入顺序包含了 Map 对象中每个元素的 [key, value] 数组。
- keys():返回一个新的 Iterator 对象, 它按插入顺序包含了 Map 对象中每个元素的键(key)。
- 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

浙公网安备 33010602011771号