1. Map 是一种新的集合类型,为这门语言带来了真正的键/值存储机 制。Map 的大多数特性都可以通过 Object 类型实现,但二者之间还是存在一些细微的差异。

一、基本API

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

二、练习

  1. const a = new Map();
  2. a.set(18, 18).set('name', 'zhangsan').set('sex', 'man');
  3. console.log(a.size); // 3
  4. console.log(a.has(18)); // true
  5. console.log(a.get('age')); // undefined
  6. console.log(a.delete('name')); // true
  7. console.log(a.has('zhangsan')); // false
  8. console.log(a.clear()); // undefined
  9. console.log(a.size); // 0