一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

如何用 Object.keys 配合 forEach 快速遍历并统计对象属性

时间:2026-08-06 14:50:49 编辑:袖梨 来源:一聚教程网

如何用 Object.keys 配合 forEach 快速遍历并统计对象属性需要先看清适用场景和关键步骤,避免只记结论却忽略实际限制。

Object.keys返回键名数组,需配合for...of或forEach遍历键再取值;统计用length最简,分组或累加需forEach;修改原对象安全但需注意快照特性;Symbol和不可枚举属性被忽略。

Object.keys 遍历对象时为什么不能直接用 for...of?

Object.keys 返回的是一个数组,但它的元素是字符串(属性名),不是键值对。很多人误以为 for...of 能直接拿到值,结果写成:

for (const val of obj) { ... }
——这会报错,因为对象不可迭代。必须先用 Object.keys 拿到键数组,再配合 forEachfor...of 遍历键,再通过 obj[key] 取值。

统计属性数量、类型、长度的典型写法

Object.keys(obj).forEach 做统计,核心是维护一个外部变量或对象。常见需求有三类:

  1. 统计总数:直接用 Object.keys(obj).length 更快,无需 forEach
  2. 按类型分组计数:比如统计 string / number / null 属性各有多少个
  3. 统计所有属性值的字符总长度(仅对 string 有效)

示例:统计 string 类型属性值的总长度

const obj = { a: 'hello', b: 123, c: 'world', d: null };let totalLen = 0;Object.keys(obj).forEach(key => {  if (typeof obj[key] === 'string') {    totalLen += obj[key].length;  }});// totalLen === 10

forEach 里修改原对象安全吗?有没有副作用?

安全,但要注意两点:

  1. forEach 遍历的是键的快照,遍历过程中增删属性不影响当前循环顺序(新增键不会被访问,已删键访问时值为 undefined
  2. 如果在回调里改了 obj[key],后续逻辑能立刻读到新值;但若依赖 Object.keys 的原始返回结果(比如提前存了键数组),则不受影响
  3. 不要在 forEach 中用 delete obj[key] 同时又继续依赖该 key 的存在,容易出逻辑错

比 Object.keys + forEach 更合适的替代方案有哪些?

取决于你要做什么:

  1. 只统计数量 → 直接用 Object.keys(obj).length,不进循环
  2. 要同时处理 key 和 value → 改用 Object.entries(obj).forEach,避免重复查 obj[key]
  3. 需要过滤或映射 → 用 Object.keys(obj).filter(...).map(...) 更函数式
  4. 兼容 IE8?Object.keys 不支持,得用 for...in + hasOwnProperty 替代

真正容易被忽略的是:Object.keys 不会返回 Symbol 属性或不可枚举属性。如果对象有 Object.defineProperty(obj, 'hidden', { enumerable: false }),它就完全不会出现在 Object.keys 结果里。

热门栏目