You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript数组元素平方函数返回原数组问题排查咨询

问题原因分析与解决方法

嘿,我来帮你捋清楚这个问题~你碰到的情况其实是JavaScript里值传递的常见小坑,咱一步步拆解:

核心问题:forEach里的i是元素的值拷贝,不是引用

你在forEach回调里写i = i * i,看起来是修改了数组元素,但实际上这个i只是原数组元素的临时副本——每次循环时,JS会把当前数组元素的值复制一份给i,你修改的只是这个副本,根本没触碰到result数组里的实际元素。这就是为啥console.log(i)能输出正确的平方值,但result数组还是原封不动的原因。

再看你的代码细节:

  • var result = [].concat(arr)这步是对的,确实创建了原数组的浅拷贝,避免修改原数组;
  • 但forEach的回调参数i是数字(基本数据类型)的拷贝,修改它不会同步到result数组里;
  • 最后返回的result自然还是和原数组一模一样的内容。

解决方法

方法1:用map方法(最推荐)

map方法天生就是用来创建新数组、转换元素的,完全适配你这个“数组元素平方”的需求,代码还更简洁:

function square(arr) {
  return arr.map(function(i) {
    return i * i;
  });
}
var arr = [1,2,3,4];
console.log(square(arr)); // 输出 [1,4,9,16]

方法2:如果非要用forEach,通过索引修改数组

要是想保留forEach的写法,得通过数组索引直接操作result里的元素,而不是修改临时变量i:

function square(arr) {
  var result = [].concat(arr);
  result.forEach(function(i, index) {
    result[index] = i * i; // 直接修改数组对应索引的位置
  });
  return result;
}
var arr = [1,2,3,4];
console.log(square(arr)); // 输出 [1,4,9,16]

总结

简单说就是:对于数字这种基本数据类型,forEach的回调参数是值的拷贝,修改参数不会影响原数组;如果要修改数组元素,要么用map这种专门的转换方法,要么通过索引直接操作数组。

内容的提问来源于stack exchange,提问作者Xinyi Li

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:44:38