在 JS 中 对象是 的一个 :
- 中 都可以作为一个键或一个值
- 中每个元素是有顺序的, 它能够记住每个元素首次
- 同 在 中的一个键只能出现一次, 它在 的集合中是独一无二的
- 同时 内部实现了 接口, 其本身又是一个 , 可被 等语法进行迭代, 关于更多迭代器的相关知识可查阅 《迭代器、生成器详解🔥🔥🔥》
2.1 创建
创建一个 实例, 可直接通过 构造函数进行创建
如果我们需要在创建 实例时, 就给定初始值, 可传一个二维数组, 如下代码所示: 和 是 值, 和 是对应的
2.2 增、改、删、查
- 可通过 方法为 对象, 或 对应键值, 该方法返回当前 对象
由于 方法返回的是当前 对象, 所以实际上它是支持链式调用的, 上面代码可以修改为:
- 可通过 方法删除 中指定元素, 该方法返回一个布尔值, 表示是否删除成功
- 可通过 方法清除 中的所有元素, 该方法没有返回值
- 可通过 方法获取指定元素, 需要注意的是: 如果该元素是个对象, 那么获取到的将是对象的 , 也就是说对获取到的对象, 所做的任何更改都会同步修改到 中对应的值
- 可通过 方法判断 对象中指定元素是否存在, 该方法返回一个布尔值, 表示对应的元素是否存在
- 可通过 属性获取当前 对象中元素个数
由于 定义了 属性, 所以 实例对象是一个 对象, 我们可以使用所有可以操作可迭代对象的语法, 包括 、展开语法、解构语法、 等等, 并且每次迭代 对象拿到的值是一个 格式的数组
3.2 Map.prototype.forEach(callbackFn, thisArg)
可通过 方法进行循环, 同 该方法支持传 :
- 参数 必填, 每次循环将执行该函数, 函数接收 个参数: (当前迭代的值)、(当前迭代的 )、(正在迭代的 对象)
- 参数 选填, 将会被作为 函数的 指向
3.3 获取「keys」「values」「entries」迭代器
对象中我们可通过原型方法 、、 分别获取到 对象中 、 以及 的一个集合, 需要注意的是这个几个方法返回的是一个
实际上这几个方法返回的 本身又是一个 , 也就是它能够直接被 进行循环迭代
关于更多迭代器的相关知识可查阅 《迭代器、生成器详解🔥🔥🔥》
3.4 循环的顺序
对象是能够记住每次插入元素的顺序的, 后面修改值不会改变元素的顺序, 所以当我们循环 对象时, 每个元素输出的顺序是和它首次被插入的顺序保持一致的, 当然 、、 等方法拿到所有值的顺序也是和插入顺序保持一致
- 上文提到 对象本身就是一个 , 同时 构造函数是允许传入一个 作为初始值的, 所以其实我们是可以把一个 对象传给 构造函数, 创建一个新的 对象, 这个过程我们可以视为 对象的一个拷贝
需要特别注意的是, 👆🏻 提到的 实际上可以理解为是 , 如下代码, 如果元素 值是一个对象, 那么通过上述方式进行拷贝, 拷贝的是 的引用地址, 也就是拷贝前后 都是指向同一个对象, 如下代码:
- 对象间可以进行合并, 但是会保持键的唯一性, 否则前面的会被后面的覆盖, 如下代码所示: 尝试将 和 进行了合并, 同时 的 被 覆盖
在 中 和 类型, 它们都允许按 对数据进行存储、删除、修改…… 不过 和 还是存在一些重要的区别:
6.1 缓存函数
如下代码, 可生成一个带有缓存功能的函数, 缓存函数会将每次请求参数和请求结果进行缓存, 当再次请求相同的参数时, 不会进行任何运算, 则是直接返回缓存中的结果
6.2 LRU 缓存
缓存: 即采用 使用的缓存策略, 它的原则是, 如果一个数据最近没有被访问到, 那么它将来被访问的几率也很小, 那么在有限的内存空间下我们就可以把长时间没有访问到的数据去除掉
如下代码, 利用 的 具有顺序的特性实现 缓存机制, 每次新增、修改、读取值时会将对应元素的缓存放到最后, 当缓存数量超出时会将第一个元素剔除
6.3 去重、计算、分组
借助于 可以是任意类型、并且键值唯一, 可用于对数据的去重、计数、分组……
7.1 Map 对象序列化
上文提到 对象是无法被 序列化、也无法被 反序列化的, 但实际上我们可以通过:
- 配置 的 参数, 实现 对象的自定义序列化
- 配置 的 参数, 实现 对象的反序列化
7.2 键相等性比较
我们都知道在 和 运算中, 不同的 是被视为不同的值
但是呢在 中关于 是基于 零值相等 算法, 也就是说 在比较键时不同的 是被视为同一个值, 同时 和 也是认为是同一个键
更多关于 JS 相等性概念可查阅 「我不知道的 JS」 相等性判断 🔥🔥🔥🔥
- 中 都可以作为一个键或一个值
- 中每个元素都是有序的, 是按照首次插入顺序
- 对象是个可迭代对象
- 在频繁增删键值对的场景下表现得更好
- 是不能够被 进行序列化的, 需要进行额外处理
- MDN-Map
- 如何实现一个缓存函数?
- How do you JSON.stringify an ES6 Map?
版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/bcyy/15438.html