
本文详解 for...of 循环的基本用法,重点说明为何 num *= num 与 console.log(num * num) 效果不同,并通过实际示例演示安全、清晰的平方计算方式。
本文详解 for...of 循环的基本用法,重点说明为何 `num *= num` 与 `console.log(num * num)` 效果不同,并通过实际示例演示安全、清晰的平方计算方式。
for...of 是 JavaScript 中用于遍历可迭代对象(如数组、字符串、Set 等)的简洁语法。它直接获取元素值(而非索引),使代码更直观、不易出错。以题目中的数组为例:
const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9];
要输出每个数的平方(即 n × n),最推荐的方式是不修改原数组元素,仅在输出时计算:
for (let num of numbers) {
console.log(num * num);
}
// 输出:1 4 9 16 25 36 49 64 81(每行一个,若需一行用空格分隔见下文)
你曾尝试 num *= num,这等价于 num = num * num —— 它会就地修改循环变量 num 的值。虽然语法合法,但存在两个关键问题:
- ✅ 不会报错或产生 NaN(除非 num 为 undefined 或非数字类型);你的 num *= num 实际能运行,例如 2 *= 2 → 4,3 *= 3 → 9,结果与 num * num 相同;
- ❌ 但这是冗余且易误导的操作:num 是每次迭代重新声明的局部变量(let 块级作用域),修改它对原数组 numbers 无影响,也无实际意义;更重要的是,它混淆了“计算”与“赋值”的意图,降低代码可读性。
? 补充说明:num *= num 并不会导致 NaN —— 你可能误将其他错误(如访问未定义属性或 null/undefined)归因于此。只要 num 是有效数字,num *= num 就是安全的,只是没必要。
若需严格按题目要求输出 1 4 9 16 25 36 49 64 81;(单行、空格分隔、末尾分号),可借助数组映射与 join():
const squares = [];
for (let num of numbers) {
squares.push(num * num);
}
console.log(squares.join(' ') + ';'); // "1 4 9 16 25 36 49 64 81;"
或更简洁地使用 map()(虽非 for...of 练习目标,但体现函数式思维):
console.log(numbers.map(n => n * n).join(' ') + ';');
✅ 总结建议:
- 优先使用 console.log(num * num) —— 意图明确、无副作用、符合练习目标;
- 避免无意义的赋值如 num *= num,除非你确实需要更新该变量后续逻辑(本例中不需要);
- num ** 2 是 ES2016 引入的幂运算符,语义更清晰,可作为 num * num 的现代替代;
- for...of 的核心优势在于“只读遍历”,保持数据纯净性,应尽量避免在循环体内意外修改迭代变量。
掌握这一点,你就真正理解了 for...of 的设计哲学:专注遍历,计算分离。











