#新手必看!Map.size 和 Object.keys().length 的区别,看完再也不混淆

前端开发中,很多人分不清 Map 和普通对象的长度获取方式------sizeObject.keys(obj).length,两者功能相似但核心不同,精简重点如下,新手也能快速记牢。

一、核心区别1:适用对象(关键!不串岗)

Map.size → 仅用于 Map 类型

Map 是 ES6 键值对结构,size 是其内置属性,直接读取即可,无需额外操作。

arduino 复制代码
const map = new Map();
map.set('name', '前端小菜鸟');
console.log(map.size); // ✅ 输出 1(直接获取)

注意:普通对象用size 会返回 undefined

Object.keys(obj).length → 仅用于普通对象

普通对象无 size 属性,需先通过Object.keys(obj) 提取键为数组,再取数组长度。

ini 复制代码
const obj = { name: '前端小菜鸟', age: 22 };
console.log(Object.keys(obj).length); // ✅ 输出 2(先转数组再计算)

注意:Map 用 Object.keys() 会返回空数组,长度为 0,完全不准。

二、核心区别2:性能差异(影响开发效率)

Map.size:速度极快(O(1))

Map 内部维护计数器,新增/删除键值对时自动更新,直接读取计数器,无需遍历,无论数据量多少,耗时一致。

Object.keys(obj).length:速度较慢(O(n))

需遍历所有键 → 生成数组 → 计算长度(n 为键值对数量),数据量越大,耗时越长。

三、补充区别(易忽略,按需记)

1. 键的类型支持

  • Map:支持任意类型(字符串、数字、对象、NaN 等);

  • 普通对象:仅支持字符串、Symbol 类型(数字会自动转字符串)。

2. 统计范围

  • Map.size:统计自身所有手动添加的键;

  • Object.keys(obj).length:仅统计自身可枚举、非 Symbol 键(忽略原型链、不可枚举、Symbol 键)。

javascript 复制代码
const obj = { a: 1 };
Object.defineProperty(obj, 'b', { value: 2, enumerable: false }); // 不可枚举
obj[Symbol('c')] = 3;
console.log(Object.keys(obj).length); // 仅输出 1(只统计 a)

四、记忆口诀 + 开发建议

Map 用 size(直接快),对象用 keys(遍历慢),各管各的不串岗!

开发建议

  1. 需多类型键、频繁增删 → 用 Map + map.size(高效);

  2. 简单字符串键存储 → 用普通对象 + Object.keys(obj).length

  3. 避免混淆:Map 不用 keys,对象不用 size,减少 bug。

核心记住"适用对象"和"性能",就能轻松用对,避免踩坑~

相关推荐
掘金者阿豪4 分钟前
把业务数据变成共享仪表盘:Metabase可视化与远程访问实践
前端·后端
kyriewen24 分钟前
折腾了半年 AI 编程工作流,最后发现效率瓶颈是桌上那块屏幕
前端·javascript·ai编程
蜗牛前端1 小时前
codex 全流程开发上线的高颜值礼簿小程序
前端·微信小程序
大龄秃头程序员2 小时前
我在图文流 App 里落地双层缓存、弱网降级与 OOM 治理
前端
老王以为2 小时前
React Renderer 分离的多平台架构
前端·react native·react.js
hunterandroid2 小时前
Kotlin Coroutines 与 Flow:让异步任务更清晰
前端
Bigger2 小时前
从零搭建 AI 代码审查服务:一份前端也能看懂的 Python 学习笔记
前端·ci/cd·ai编程
lichenyang4532 小时前
JSAPI、NAPI、Biz、Imp:ASCF Demo 如何真正调用系统能力和 C++ 能力
前端
lichenyang4533 小时前
IPC、JSVM、UIThread、libuv:ASCF 架构图里最容易混的几个词
前端
用户059540174463 小时前
Redis记忆存储故障恢复测试踩坑实录:手动测试让我漏掉了2个一致性Bug
前端·css