JavaScript Map

JavaScript 的 ES6 引入了两个新的数据结构,即 MapWeakMap

Map 类似于 JavaScript 中的对象,允许我们以 键/值 对的形式存储元素。

Map 中的元素按插入顺序插入。但是,与对象不同,Map 可以包含 对象函数 和其他 数据类型 作为键。


创建 JavaScript Map

要创建 Map,我们使用 new Map() 构造函数。例如,

// create a Map
const map1 = new Map(); // an empty map
console.log(map1); // Map {}

向 Map 插入项

创建 Map 后,您可以使用 set() 方法向其插入元素。例如,

// create a map
let map1 = new Map();

// insert key-value pair
map1.set('info', {name: 'Jack', age: 26});
console.log(map1); // Map {"info" => {name: "Jack", age: 26}}

您也可以使用对象或函数作为键。例如,

// Map with object key
let map2 = new Map();

let obj = {};
map2.set(obj, {name: 'Jack', age: "26"});

console.log(map2); // Map {{} => {name: "Jack", age: "26"}}

访问 Map 元素

您可以使用 get() 方法访问 Map 元素。例如,

let map1 = new Map();
map1.set('info', {name: 'Jack', age: "26"});

// access the elements of a Map
console.log(map1.get('info')); // {name: "Jack", age: "26"}

检查 Map 元素

您可以使用 has() 方法检查 Map 中是否存在某个元素。例如,

const set1 = new Set([1, 2, 3]);

let map1 = new Map();
map1.set('info', {name: 'Jack', age: "26"});

// check if an element is in Set
console.log(map1.has('info')); // true

删除元素

您可以使用 clear()delete() 方法从 Map 中删除元素。

delete() 方法如果指定的键/值对存在并已被删除,则返回 true,否则返回 false。例如,

let map1 = new Map();
map1.set('info', {name: 'Jack', age: "26"});

// removing a particular element
map1.delete('address'); // false
console.log(map1); // Map {"info" => {name: "Jack", age: "26"}} 

map1.delete('info'); // true
console.log(map1); // Map {}

clear() 方法会从 Map 对象中删除所有键/值对。例如,

let map1 = new Map();
map1.set('info', {name: 'Jack', age: "26"});

// removing all element
map1.clear();
console.log(map1); // Map {}

JavaScript Map 大小

您可以使用 size 属性获取 Map 中的元素数量。例如,

let map1 = new Map();
map1.set('info', {name: 'Jack', age: "26"});

console.log(map1.size); // 1

迭代 Map

您可以使用 for...of 循环或 forEach() 方法迭代 Map 元素。元素按插入顺序访问。例如,

let map1 = new Map();
map1.set('name', 'Jack');
map1.set('age', '27');

// looping through Map
for (let [key, value] of map1) {
    console.log(key + '- ' + value);
}

输出

name- Jack
age- 27

您也可以使用 forEach() 方法获得与上面程序相同的结果。例如,

// using forEach method()
let map1 = new Map();
map1.set('name', 'Jack');
map1.set('age', '27');

// looping through Map
map1.forEach(function(value, key) {
  console.log(key + '- ' + value)
})

迭代 Map 键

您可以使用 key() 方法迭代 Map 并获取键。例如,

let map1 = new Map();
map1.set('name', 'Jack');
map1.set('age', '27');

// looping through the Map
for (let key of map1.keys()) {
  console.log(key)
}

输出

name
age

迭代 Map 值

您可以使用 values() 方法迭代 Map 并获取值。例如,

let map1 = new Map();
map1.set('name', 'Jack');
map1.set('age', '27');

// looping through the Map
for (let values of map1.values()) {
    console.log(values);
}

输出

Jack
27

获取 Map 的键/值

您可以使用 entries() 方法迭代 Map 并获取 Map 的键/值。例如,

let map1 = new Map();
map1.set('name', 'Jack');
map1.set('age', '27');

// looping through the Map
for (let elem of map1.entries()) {
    console.log(`${elem[0]}: ${elem[1]}`);
}

输出

name: Jack
age: 27

JavaScript Map 与 Object 对比

Map 对象
Map 可以包含对象和其他数据类型作为键。 对象只能包含字符串和符号作为键。
Map 可以直接迭代并访问其值。 对象可以通过访问其键来迭代。
Map 的元素数量可以通过 size 属性确定。 对象需要手动确定元素数量。
对于需要频繁添加或删除元素的程序,Map 的性能更好。 如果程序需要频繁添加或删除元素,对象性能不佳。

JavaScript WeakMap

WeakMap 类似于 Map。但是,WeakMap 只能包含对象作为键。例如,

const weakMap = new WeakMap();
console.log(weakMap); // WeakMap {} 

let obj = {};

// adding object (element) to WeakMap
weakMap.set(obj, 'hello');

console.log(weakMap); // WeakMap {{} => "hello"}

当您尝试添加对象以外的其他数据类型时,WeakMap 会引发错误。例如,

const weakMap = new WeakMap();

// adding string as a key to WeakMap
weakMap.set('obj', 'hello');
// throws error
// TypeError: Attempted to set a non-object key in a WeakMap

WeakMap 方法

WeakMaps 具有 get()set()delete()has() 方法。例如,

const weakMap = new WeakMap();
console.log(weakMap); // WeakMap {} 

let obj = {};

// adding object (element) to WeakMap
weakMap.set(obj, 'hello');

console.log(weakMap); // WeakMap {{} => "hello"}

// get the element of a WeakMap
console.log(weakMap.get(obj)); // hello

// check if an element is present in WeakMap
console.log(weakMap.has(obj)); // true

// delete the element of WeakMap
console.log(weakMap.delete(obj)); // true

console.log(weakMap); // WeakMap {} 

WeakMaps 不可迭代

与 Maps 不同,WeakMaps 不可迭代。例如,

const weakMap = new WeakMap();
console.log(weakMap); // WeakMap {} 

let obj = {};

// adding object (element) to WeakMap
weakMap.set(obj, 'hello');


// looping through WeakMap
for (let i of weakMap) {

    console.log(i);  // TypeError
}

JavaScript 的 MapWeakMap 是在 ES6 中引入的。某些浏览器可能不支持它们的使用。要了解更多信息,请访问 JavaScript Map 支持JavaScript WeakMap 支持


另请阅读

你觉得这篇文章有帮助吗?

我们的高级学习平台,凭借十多年的经验和数千条反馈创建。

以前所未有的方式学习和提高您的编程技能。

试用 Programiz PRO
  • 交互式课程
  • 证书
  • AI 帮助
  • 2000+ 挑战