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
相关产品推荐
相关产品推荐

