当前位置: 首页 > news >正文

JS Map使用方法

JS Map使用方法

Map 是 ES6 引入的一种新的数据结构,它类似于对象(Object),但提供了更强大的键值对存储功能。

文章目录

  • JS Map使用方法
    • 基本特性
    • 基本用法
      • 创建 Map
      • 常用方法
      • 遍历方法
    • 与 Object 的区别
    • 实际应用示例
      • 示例1:统计字符出现次数
      • 示例2:缓存计算结果
      • 示例3:对象作为键
    • 注意事项

基本特性

  1. 任意类型的键Map 的键可以是任意值(包括对象、函数等),而普通对象的键只能是字符串或 Symbol
  2. 有序性Map 会记住键的原始插入顺序
  3. 大小可获取:可以直接通过 size 属性获取 Map 中的元素数量
  4. 性能优化:在频繁增删键值对的场景下,Map 的性能通常优于普通对象

基本用法

创建 Map

// 创建一个空 Map
const map = new Map();// 通过二维数组初始化 Map
const map2 = new Map([['key1', 'value1'],['key2', 'value2']
]);

常用方法

方法描述示例
set(key, value)添加或更新键值对map.set('name', 'Alice')
get(key)获取键对应的值map.get('name') // ‘Alice’
has(key)检查是否存在某个键map.has('name') // true
delete(key)删除指定键值对map.delete('name')
clear()清空所有键值对map.clear()
size获取键值对数量map.size

遍历方法

const map = new Map([['name', 'Alice'],['age', 25],['job', 'Developer']
]);// 1. for...of 遍历
for (const [key, value] of map) {console.log(key, value);
}// 2. forEach 方法
map.forEach((value, key) => {console.log(key, value);
});// 3. 获取键、值或键值对的迭代器
console.log([...map.keys()]);    // ['name', 'age', 'job']
console.log([...map.values()]);  // ['Alice', 25, 'Developer']
console.log([...map.entries()]); // 同直接遍历 map

与 Object 的区别

特性MapObject
键的类型任意值只能是字符串或 Symbol
键的顺序有序(插入顺序)无序(ES6后也有序但不保证)
大小size 属性需要手动计算
性能频繁增删时表现更好频繁增删时性能较差
默认键有原型链上的键
序列化不能直接 JSON.stringify可以直接序列化

实际应用示例

示例1:统计字符出现次数

function countChars(str) {const map = new Map();for (const char of str) {map.set(char, (map.get(char) || 0) + 1);}return map;
}const result = countChars('hello');
console.log(result.get('l')); // 2

示例2:缓存计算结果

const cache = new Map();function factorial(n) {if (cache.has(n)) return cache.get(n);if (n === 0) return 1;const result = n * factorial(n - 1);cache.set(n, result);return result;
}console.log(factorial(5)); // 120
console.log(cache); // Map { 1 => 1, 2 => 2, 3 => 6, 4 => 24, 5 => 120 }

示例3:对象作为键

const user1 = { id: 1, name: 'Alice' };
const user2 = { id: 2, name: 'Bob' };const userSettings = new Map();
userSettings.set(user1, { theme: 'dark' });
userSettings.set(user2, { theme: 'light' });console.log(userSettings.get(user1)); // { theme: 'dark' }

注意事项

  1. 键的比较Map 使用 “SameValueZero” 算法比较键(类似于 ===,但 NaN 等于 NaN
  2. 内存管理:如果使用对象作为键,即使对象被设为 nullMap 仍然会保留对它的引用
  3. 序列化Map 不能直接使用 JSON.stringify(),需要先转换为数组
    NaN 等于 NaN
  4. 内存管理:如果使用对象作为键,即使对象被设为 nullMap 仍然会保留对它的引用
  5. 序列化Map 不能直接使用 JSON.stringify(),需要先转换为数组
  6. WeakMap:如果需要弱引用,可以使用 WeakMap,它只接受对象作为键且不可遍历
http://www.xdnf.cn/news/426655.html

相关文章:

  • Linux上的rm和srm 命令
  • Femap许可网络配置
  • MRI、DX、CT 医学影像常用术语详解:概念与应用
  • 在Babylon.js中实现完美截图的艺术:包含Canvas和HTML覆盖层
  • 【完全平方数包含相同数】2021-11-30
  • LeetCode 3335.字符串转换后的长度 I:I先递推
  • 运用数组和矩阵对数据进行存取和运算——NumPy模块 之六
  • 浅谈 Redis 数据类型
  • 【PmHub后端篇】PmHub中基于Redis加Lua脚本的计数器算法限流实现
  • 【Canda】常用命令+虚拟环境创建到选择
  • aardio —— 虚表 —— 同一单元格内用不同的字体
  • maven中relativepath标签的含义及使用方法
  • TensorFlow 常见使用场景及开源项目实例
  • 大模型MCP之UV安装使用
  • 数据集-目标检测系列- 杨桃 数据集 Starfruit>> DataBall
  • leetcode 189. 轮转数组
  • 养生:打造健康生活的全方位策略
  • GPT-4.1和GPT-4.1-mini系列模型支持微调功能,助力企业级智能应用深度契合业务需求
  • Comparator不满足自反性错误,Comparison method violates its general contract
  • Cursor开发酒店管理系统
  • RevIN(Reversible Instance Normalization)及其在时间序列中的应用
  • SpringBoot中使用集群版Redis
  • sparkSQL读入csv文件写入mysql
  • 基于自动化工具autox.js的抢票(猫眼)
  • P1032 [NOIP 2002 提高组] 字串变换
  • [ctfshow web入门] web72
  • vscode百宝箱工具插件(devtools)
  • 数据可视化图表
  • pe文件二进制解析(用c/c++解析一个二进制pe文件)
  • 网络层试题