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

为何JavaScript的map函数不会修改原数组中的值?

为啥map里修改item没改变原数组?

嘿,你的这个认知确实有个小误区,咱们一步步理清楚:

首先看你写的这段代码:

const array = [ 1, 2, 3 ]
array.map(item => { item = item + 1 })
console.log(array) // 输出依然是 [1, 2, 3]

核心原因:基本类型是按值传递的

你的数组里存的是数字(基本类型),当map遍历的时候,回调里的item其实是原数组元素的值副本,不是原元素的引用。你做item = item + 1只是修改了这个副本的值,原数组里的元素根本没被触动。

再说说map方法本身的定位

map的设计目的是返回一个新数组,里面是每个元素经过回调处理后的结果,它本身不会修改原数组(除非你在回调里主动操作原数组的索引)。你现在的代码里完全没接收map返回的新数组,等于白执行了一遍遍历。

正确的做法

如果想要得到修改后的数组,应该接收map的返回值:

const array = [1, 2, 3]
const newArray = array.map(item => item + 1)
console.log(newArray) // 输出 [2, 3, 4]
console.log(array) // 原数组保持不变 [1, 2, 3]

如果非要修改原数组(虽然不推荐,因为会破坏数据不可变性),可以通过索引操作:

const array = [1, 2, 3]
array.forEach((item, index) => {
  array[index] = item + 1
})
console.log(array) // 输出 [2, 3, 4]

补充:引用类型的情况

要是数组里存的是对象(引用类型),情况就不一样了:

const array = [{ num: 1 }, { num: 2 }, { num: 3 }]
array.map(item => { item.num = item.num + 1 })
console.log(array) // 输出 [{ num: 2 }, { num: 3 }, { num: 4 }]

这时候item是原对象的引用,修改它的属性会直接影响原数组里的对象。但如果是给item重新赋值一个新对象,那还是不会改变原数组,因为这相当于断开了和原引用的连接:

const array = [{ num: 1 }, { num: 2 }, { num: 3 }]
array.map(item => { item = { num: item.num + 1 } })
console.log(array) // 依然是原来的 [{ num: 1 }, ...]

内容的提问来源于stack exchange,提问作者john maccarthy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:24:45