Map 是一种新的集合类型,为这门语言带来了真正的键/值存储机 制。Map 的大多数特性都可以通过 Object 类型实现,但二者之间还是存在一些细微的差异。
一、基本API
使用 new 关键字和 Map 构造函数可以创建一个空映射:const m = new Map(); 如果想在创建的同时初始化实例,可以给 Map 构造函数传入一个可迭代对象,需要包含键/值对数组。可迭代对象中的每个键/值对都会按照迭代顺序插入到新映射实例中:// 使用嵌套数组初始化映射const m1 = new Map([ ["key1", "val1"], ["key2", "val2"], ["key3", "val3"] ]); alert(m1.size); // 3 // 使用自定义迭代器初始化映射const m2 = new Map({ [Symbol.iterator]: function*() { yield ["key1", "val1"]; yield ["key2", "val2"]; yield ["key3", "val3"]; } }); alert(m2.size); // 3// 映射期待的键/值对,无论是否提供const m3 = new Map([[]]); alert(m3.has(undefined)); // true alert(m3.get(undefined)); // undefined
初始化之后,可以使用 set()方法再添加键/值对。另外,可以使用 get()和 has()进行查询,可以通过 size 属性获取映射中的键/值对的数量,还可以使用 delete()和 clear()删除值。const m = new Map(); alert(m.has("firstName")); // false alert(m.get("firstName")); // undefined alert(m.size); // 0 m.set("firstName", "Matt") .set("lastName", "Frisbie"); alert(m.has("firstName")); // true alert(m.get("firstName")); // Matt alert(m.size); // 2 m.delete("firstName"); // 只删除这一个键/值对alert(m.has("firstName")); // false alert(m.has("lastName")); // true alert(m.size); // 1 m.clear(); // 清除这个映射实例中的所有键/值对alert(m.has("firstName")); // false alert(m.has("lastName")); // false alert(m.size); // 0 set()方法返回映射实例,因此可以把多个操作连缀起来,包括初始化声明:const m = new Map().set("key1", "val1"); m.set("key2", "val2") .set("key3", "val3"); alert(m.size); // 3
与 Object 只能使用数值、字符串或符号作为键不同,Map 可以使用任何 JavaScript 数据类型作为键。Map 内部使用 SameValueZero 比较操作(ECMAScript 规范内部定义,语言中不能使用),基本上相当于使用严格对象相等的标准来检查键的匹配性。与 Object 类似,映射的值是没有限制的。const m = new Map(); const functionKey = function() {}; const symbolKey = Symbol(); const objectKey = new Object();m.set(functionKey, "functionValue"); m.set(symbolKey, "symbolValue"); m.set(objectKey, "objectValue"); alert(m.get(functionKey)); // functionValue alert(m.get(symbolKey)); // symbolValue alert(m.get(objectKey)); // objectValue // SameValueZero 比较意味着独立实例不冲突alert(m.get(function() {})); // undefined
与严格相等一样,在映射中用作键和值的对象及其他“集合”类型,在自己的内容或属性被修改时仍然保持不变:const m = new Map(); const objKey = {}, objVal = {}, arrKey = [], arrVal = [];m.set(objKey, objVal); m.set(arrKey, arrVal); objKey.foo = "foo"; objVal.bar = "bar"; arrKey.push("foo"); arrVal.push("bar");console.log(m.get(objKey)); // {bar: "bar"} console.log(m.get(arrKey)); // ["bar"]
二、练习
const a = new Map();a.set(18, 18).set('name', 'zhangsan').set('sex', 'man');console.log(a.size); // 3console.log(a.has(18)); // trueconsole.log(a.get('age')); // undefinedconsole.log(a.delete('name')); // trueconsole.log(a.has('zhangsan')); // falseconsole.log(a.clear()); // undefinedconsole.log(a.size); // 0