JavaScript Map对象

描述

  • Map和Set是ES6标准新增的数据类型,主要的应用场景在于数组去重和数据存储。
  • 一个Map对象在迭代时会根据对象中元素的插入顺序来进行。
  • 一个 for…of 循环在每次迭代后会返回一个形式为[key,value]的数组。

键的相等(Key equality)

  • 键的比较是基于 sameValueZero 算法:
    NaN 是与 NaN 相等的(虽然 NaN !== NaN),剩下所有其它的值是根据 === 运算符的结果判断是否相等。
  • 在目前的ECMAScript规范中,-0和+0被认为是相等的,尽管这在早期的草案中并不是这样。

Map与Object

MapObject
意外的键默认情况不包含任何键。只包含显式插入的键。一个 Object 有一个原型, 原型链上的键名有可能和你自己在对象上的设置的键名产生冲突。
键的类型键可以是任意值,包括函数、对象或任意基本类型。键必须是一个 String 或是Symbol。
键的顺序key 是有序的。因此,当迭代的时候,一个 Map 对象以插入的顺序返回键值。键是无序的。
size可以直接通过size 属性获取只能手动计算
迭代可以直接被迭代需要以某种方式获取它的键然后才能迭代
性能在频繁增删键值对的场景下表现更好。在频繁添加和删除键值对的场景下未作出优化。

实例

  • Map.prototype.constructor
    返回一个函数,它创建了实例的原型。默认是Map函数。
  • Map.prototype.size
    返回Map对象的键/值对的数量。

方法

  • Map.prototype.clear()
    移除Map对象的所有键/值对 。
  • Map.prototype.delete(key)
    如果 Map 对象中存在该元素,则移除它并返回 true;否则如果该元素不存在则返回 false。随后调用 Map.prototype.has(key) 将返回 false 。
  • Map.prototype.entries()
    返回一个新的 Iterator 对象,它按插入顺序包含了Map对象中每个元素的 [key, value] 数组。
  • Map.prototype.forEach(callbackFn[, thisArg])
    按插入顺序,为 Map对象里的每一键值对调用一次callbackFn函数。如果为forEach提供了thisArg,它将在每次回调中作为this值。
  • Map.prototype.get(key)
    返回键对应的值,如果不存在,则返回undefined。
  • Map.prototype.has(key)
    返回一个布尔值,表示Map实例是否包含键对应的值。
  • Map.prototype.keys()
    返回一个新的 Iterator对象, 它按插入顺序包含了Map对象中每个元素的键 。
  • Map.prototype.set(key, value)
    设置Map对象中键的值。返回该Map对象。
  • Map.prototype.values()
    返回一个新的Iterator对象,它按插入顺序包含了Map对象中每个元素的值 。
  • Map.prototype@@iterator
    返回一个新的Iterator对象,它按插入顺序包含了Map对象中每个元素的 [key, value] 数组。

示例

  1. 将 NaN 作为 Map 的键
    NaN 也可以作为Map对象的键。虽然 NaN 和任何值甚至和自己都不相等(NaN !== NaN 返回true),但下面的例子表明,NaN作为Map的键来说是没有区别的:
let myMap = new Map();
myMap.set(NaN, "not a number");

myMap.get(NaN); // "not a number"

let otherNaN = Number("foo");
myMap.get(otherNaN); // "not a number"
  1. Map 与数组
let kvArray = [["key1", "value1"], ["key2", "value2"]];

// 使用常规的Map构造函数可以将一个二维键值对数组转换成一个Map对象
let myMap = new Map(kvArray);

myMap.get("key1"); // 返回值为 "value1"

// 使用Array.from函数可以将一个Map对象转换成一个二维键值对数组
console.log(Array.from(myMap)); // 输出和kvArray相同的数组

// 更简洁的方法来做如上同样的事情,使用展开运算符
console.log([...myMap]);

// 或者在键或者值的迭代器上使用Array.from,进而得到只含有键或者值的数组
console.log(Array.from(myMap.keys())); // 输出 ["key1", "key2"]
  1. Maps合并
    Maps对象间合并,会保持键的唯一性:
let first = new Map([
  [1, 'one'],
  [2, 'two'],
  [3, 'three'],
]);

let second = new Map([
  [1, 'uno'],
  [2, 'dos']
]);

// 合并两个Map对象时,如果有重复的键值,则后面的会覆盖前面的。
// 展开运算符本质上是将Map对象转换成数组。
let merged = new Map([...first, ...second]);

console.log(merged.get(1)); // uno
console.log(merged.get(2)); // dos
console.log(merged.get(3)); // three

Map对象与数组合并,如果有重复的键值,则后面的会覆盖前面的:

let first = new Map([
  [1, 'one'],
  [2, 'two'],
  [3, 'three'],
]);

let second = new Map([
  [1, 'uno'],
  [2, 'dos']
]);

// Map对象同数组进行合并时,如果有重复的键值,则后面的会覆盖前面的。
let merged = new Map([...first, ...second, [1, 'eins']]);

console.log(merged.get(1)); // eins
console.log(merged.get(2)); // dos
console.log(merged.get(3)); // three
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值