
本文详解如何使用 for...in 循环遍历 JavaScript 对象的每个嵌套产品项,并安全、高效地将所有产品的 price 属性降低 20%,适用于初学者理解对象遍历与原地更新的核心逻辑。
本文详解如何使用 `for...in` 循环遍历 javascript 对象的每个嵌套产品项,并安全、高效地将所有产品的 `price` 属性降低 20%,适用于初学者理解对象遍历与原地更新的核心逻辑。
在 JavaScript 中,当数据以对象形式组织(如 { product1: { name, price, quantity }, ... }),且需批量修改其嵌套属性时,for...in 是最直观的遍历方式。它会枚举对象自身可枚举的字符串键(即 product1、product2 等),再通过方括号语法 products[key] 获取对应产品对象,从而直接修改其 price 属性。
注意:降价 20% 等价于保留原价的 80%,因此只需将 price 乘以 0.8。推荐使用复合赋值运算符 *=,既简洁又语义清晰(product.price *= 0.8 等同于 product.price = product.price * 0.8)。
以下是完整可运行示例:
const products = {
product1: {
name: 'Pasta',
price: 25,
quantity: 5,
},
product2: {
name: 'Pizza',
price: 20,
quantity: 3,
},
product3: {
name: 'Cola',
price: 8,
quantity: 4,
},
};
// 遍历 products 对象的每一个键(productId)
for (const productId in products) {
// 确保该属性属于对象自身(非原型链继承),增强健壮性
if (products.hasOwnProperty(productId)) {
const product = products[productId];
// 安全检查:仅当 price 存在且为数字时执行计算
if (typeof product.price === 'number' && !isNaN(product.price)) {
product.price *= 0.8;
}
}
}
console.log(products);
// 输出中各 product.price 已更新为:20、16、6.4✅ 关键要点总结:
-
for...in适合遍历对象键,但务必配合hasOwnProperty()防止意外遍历原型属性; - 直接修改
product.price是原地更新(mutating),不创建新对象——若需不可变更新(如 React 场景),应使用Object.fromEntries()+map()构建新对象; - 添加类型校验(如
typeof price === 'number')可提升代码鲁棒性,避免undefined * 0.8等静默错误; - 小数精度问题(如
6.400000000000001)属 JS 浮点数特性,如需展示友好格式,可用product.price.toFixed(2)转字符串,但注意返回值为字符串类型,计算前需parseFloat()。
掌握此模式后,你可轻松扩展至其他批量操作,例如统一添加折扣标识、按条件筛选降价商品或汇总总价。

















