一个 Object 的键只能是字符串或者 Symbols,但一个 Map 的键可以是任意值。
Map 中的键值是有序的(FIFO 原则),而添加到对象中的键则不是。
Map 的键值对个数可以从 size 属性获取,而 Object 的键值对个数只能手动计算。
Object 都有自己的原型,原型链上的键名有可能和你自己在对象上的设置的键名产生冲突。
Map 中的 key
key 是字符串
var myMap = new Map();
var keyString = "a string";
myMap.set(keyString, "和键'a string'关联的值");
myMap.get(keyString);
myMap.get("a string");
key 是对象
var myMap = new Map();
var keyObj = {}, myMap.set(keyObj, "和键 keyObj 关联的值");
myMap.get(keyObj);
myMap.get({});
key 是函数
var myMap = new Map();
var keyFunc = function () {},
myMap.set(keyFunc, "和键 keyFunc 关联的值");
myMap.get(keyFunc);
myMap.get(function() {})
key 是 NaN
var myMap = new Map();
myMap.set(NaN, "not a number");
myMap.get(NaN);
var otherNaN = Number("foo");
myMap.get(otherNaN);
虽然 NaN 和任何值甚至和自己都不相等(NaN !== NaN 返回true),NaN作为Map的键来说是没有区别的
Map 的迭代
for...of
var myMap = new Map();
myMap.set(0, "zero");
myMap.set(1, "one");
for (var [key, value] of myMap) {
console.log(key + " = " + value);
for (var [key, value] of myMap.entries()) {
console.log(key + " = " + value);
for (var key of myMap.keys()) {
console.log(key);
for (var value of myMap.values()) {
console.log(value);
forEach()
var myMap = new Map();
myMap.set(0, "zero");
myMap.set(1, "one");
myMap.forEach(function(value, key) {
console.log(key + " = " + value);
Map 对象的操作
Map 与 Array的转换
var kvArray = [["key1", "value1"], ["key2", "value2"]];
var myMap = new Map(kvArray);
var outArray = Array.from(myMap);
Map 的克隆
var myMap1 = new Map([["key1", "value1"], ["key2", "value2"]]);
var myMap2 = new Map(myMap1);
console.log(myMap1 === myMap2);
Map 的合并
var first = new Map([[1, 'one'], [2, 'two'], [3, 'three'],]);
var second = new Map([[1, 'uno'], [2, 'dos']]);
var merged = new Map([...first, ...second]);
console.log(merged);
Set 对象
Set 对象允许你存储任何类型的唯一值,无论是原始值或者是对象引用。
Set 中的特殊值
Set 对象存储的值总是唯一的,所以需要判断两个值是否恒等。有几个特殊值需要特殊对待:
+0 与 -0 在存储判断唯一性的时候是恒等的,所以不重复;
undefined 与 undefined 是恒等的,所以不重复;
NaN 与 NaN 是不恒等的,但是在 Set 中只能存一个,不重复。
let mySet = new Set();
mySet.add(1);
mySet.add(5);
mySet.add(5);
mySet.add("some text");
var o = {a: 1, b: 2};
mySet.add(o);
mySet.add({a: 1, b: 2});
Array
var mySet = new Set(["value1", "value2", "value3"]);
var myArray = [...mySet];
String
var mySet = new Set('hello');
Set 对象作用
var mySet = new Set([1, 2, 3, 4, 4]);
[...mySet];
var a = new Set([1, 2, 3]);
var b = new Set([4, 3, 2]);
var union = new Set([...a, ...b]);
var a = new Set([1, 2, 3]);
var b = new Set([4, 3, 2]);
var intersect = new Set([...a].filter(x => b.has(x)));
var a = new Set([1, 2, 3]);
var b = new Set([4, 3, 2]);
var difference = new Set([...a].filter(x => !b.has(x)));
复制代码