如何用 Object.keys 配合 forEach 快速遍历并统计对象属性需要先看清适用场景和关键步骤,避免只记结论却忽略实际限制。
Object.keys返回键名数组,需配合for...of或forEach遍历键再取值;统计用length最简,分组或累加需forEach;修改原对象安全但需注意快照特性;Symbol和不可枚举属性被忽略。
Object.keys 返回的是一个数组,但它的元素是字符串(属性名),不是键值对。很多人误以为 for...of 能直接拿到值,结果写成:
for (const val of obj) { ... }——这会报错,因为对象不可迭代。必须先用 Object.keys 拿到键数组,再配合 forEach 或 for...of 遍历键,再通过 obj[key] 取值。用 Object.keys(obj).forEach 做统计,核心是维护一个外部变量或对象。常见需求有三类:
Object.keys(obj).length 更快,无需 forEach
示例:统计 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 遍历的是键的快照,遍历过程中增删属性不影响当前循环顺序(新增键不会被访问,已删键访问时值为 undefined)obj[key],后续逻辑能立刻读到新值;但若依赖 Object.keys 的原始返回结果(比如提前存了键数组),则不受影响forEach 中用 delete obj[key] 同时又继续依赖该 key 的存在,容易出逻辑错取决于你要做什么:
Object.keys(obj).length,不进循环Object.entries(obj).forEach,避免重复查 obj[key]
Object.keys(obj).filter(...).map(...) 更函数式Object.keys 不支持,得用 for...in + hasOwnProperty 替代真正容易被忽略的是:Object.keys 不会返回 Symbol 属性或不可枚举属性。如果对象有 Object.defineProperty(obj, 'hidden', { enumerable: false }),它就完全不会出现在 Object.keys 结果里。