
本文详解如何使用 for...in 循环遍历 JavaScript 对象,安全、高效地批量更新嵌套对象中的特定属性(如 price),并提供可直接运行的示例代码与关键注意事项。
本文详解如何使用 `for...in` 循环遍历 javascript 对象,安全、高效地批量更新嵌套对象中的特定属性(如 `price`),并提供可直接运行的示例代码与关键注意事项。
在 JavaScript 中,当需要对一个键值对结构的对象(如商品集合)进行统一属性操作时,for...in 是最直观且适用的遍历方式。它能枚举对象自身可枚举的字符串键(如 product1、product2),从而逐个访问并修改其内部属性。
以下是一个完整、健壮的实现方案:
const products = {
product1: { name: 'Pasta', price: 25, quantity: 5 },
product2: { name: 'Pizza', price: 20, quantity: 3 },
product3: { name: 'Cola', price: 8, quantity: 4 }
};
// 使用 for...in 遍历对象的所有自有可枚举属性
for (const key in products) {
// 安全检查:确保该属性属于对象自身(非原型链继承)
if (Object.prototype.hasOwnProperty.call(products, key)) {
const product = products[key];
// 验证 product 存在且为对象,并包含 price 属性
if (product && typeof product === 'object' && 'price' in product && typeof product.price === 'number') {
product.price = Math.round(product.price * 0.8 * 100) / 100; // 保留两位小数,避免浮点误差
}
}
}
console.log(products);
// 输出示例:
// {
// product1: { name: 'Pasta', price: 20, quantity: 5 },
// product2: { name: 'Pizza', price: 16, quantity: 3 },
// product3: { name: 'Cola', price: 6.4, quantity: 4 }
// }✅ 关键要点说明:
-
避免原型污染:始终用
hasOwnProperty()或Object.prototype.hasOwnProperty.call()检查属性是否属于对象自身,防止意外修改继承属性; -
类型防护:显式校验
product是否为有效对象、price是否为数字,提升代码鲁棒性; -
精度处理:乘以
0.8后可能产生浮点数误差(如8 * 0.8 = 6.400000000000001),建议用Math.round(... * 100) / 100保留两位小数; -
原地修改 vs 新对象:本例直接修改原对象(适合简单场景);若需不可变更新,可用
Object.fromEntries()+Object.entries()构建新对象。
? 进阶提示:若未来数据结构变为数组(如 products = [{id: 'p1', ...}, ...]),推荐改用 products.map() 实现函数式更新,更符合现代 JS 实践。

















