欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

JavaScript Map对象(代码实例)

程序员文章站 2022-06-27 20:46:46
描述Map和Set是ES6标准新增的数据类型,主要的应用场景在于数组去重和数据存储。一个Map对象在迭代时会根据对象中元素的插入顺序来进行。一个 for…of 循环在每次迭代后会返回一个形式为[key,value]的数组。键的相等(Key equality)键的比较是基于 sameValueZero 算法:NaN 是与 NaN 相等的(虽然 NaN !== NaN),剩下所有其它的值是根据 === 运算符的结果判断是否相等。在目前的ECMAScript规范中,-0和+0被认为是相等的,...



描述

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

键的相等(Key equality)

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

Map与Object

Map Object
意外的键 默认情况不包含任何键。只包含显式插入的键。 一个 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 

本文地址:https://blog.csdn.net/evianzhai/article/details/107861844

相关标签: JavaScript Map