Javascript 为什么这个映射函数不改变原始数组中的值?

Javascript 为什么这个映射函数不改变原始数组中的值?,javascript,arrays,ecmascript-6,Javascript,Arrays,Ecmascript 6,以下是相关代码: const array = [ 1, 2, 3 ] array.map(item => { item = item + 1 }) console.log(array) 我认为map方法中的item-first参数是对数组中原始项的引用,直接对其进行变异将更改第一个数组的内容。。。这不是真的吗?函数返回一个新数组,它不会更改原始数组 item是item=>{…}中的局部变量。赋值项=item+1不会更改原始元素,而是更改item局部变量 如果要更改元素,for

以下是相关代码:

const array = [
  1, 2, 3
]

array.map(item => {
  item = item + 1
})

console.log(array)
我认为map方法中的item-first参数是对数组中原始项的引用,直接对其进行变异将更改第一个数组的内容。。。这不是真的吗?

函数返回一个新数组,它不会更改原始数组

item是item=>{…}中的局部变量。赋值项=item+1不会更改原始元素,而是更改item局部变量

如果要更改元素,forEach函数会更有效,因为它不会创建新数组:

array.forEach((item, index) => {
    array[index] = item + 1;
});
函数返回一个新数组,但不更改原始数组

item是item=>{…}中的局部变量。赋值项=item+1不会更改原始元素,而是更改item局部变量

如果要更改元素,forEach函数会更有效,因为它不会创建新数组:

array.forEach((item, index) => {
    array[index] = item + 1;
});
您的数组包含原语类型的元素。基元类型的变量不能通过其引用进行变异。例如,如果数组的元素是对象,则可以进行变异,如下所示:

var数组=[{val:1},{val:2},{val:3}]; array.mapitem=>{item.val=item.val+1}; console.logarray 您的数组包含原语类型的元素。基元类型的变量不能通过其引用进行变异。例如,如果数组的元素是对象,则可以进行变异,如下所示:

var数组=[{val:1},{val:2},{val:3}]; array.mapitem=>{item.val=item.val+1}; console.logarray Mozilla说

map方法使用调用 在调用数组中的每个元素上提供函数

所以,map函数不会改变数组的值

我知道你不想这样,但你可以用这个:

常量数组=[ 1, 2, 3 ] array.mapitem,k=>{ 数组[k]=项+1 } logarrayMozilla说

map方法使用调用 在调用数组中的每个元素上提供函数

所以,map函数不会改变数组的值

我知道你不想这样,但你可以用这个:

常量数组=[ 1, 2, 3 ] array.mapitem,k=>{ 数组[k]=项+1 }

console.logarrayOP不关心返回值。想象一下,这段代码用一个更复杂的对象代替了项。然后可以执行item.someproperty=1-这就是OP要问的问题。@JamesThorpe能否在JavaScript中重载运算符+?否。由于按值复制的方式,item只能在本地更新,因为它是一个原语。如果它是一个更复杂的对象,您可以更改该对象的属性,但不能用完全不同的对象替换它。@JamesThorpe我不确定您的注释与这段特定代码的相关性如何。您正在讨论其他内容。OP不关心返回值。想象一下,这段代码用一个更复杂的对象代替了项。然后可以执行item.someproperty=1-这就是OP要问的问题。@JamesThorpe能否在JavaScript中重载运算符+?否。由于按值复制的方式,item只能在本地更新,因为它是一个原语。如果它是一个更复杂的对象,您可以更改该对象的属性,但不能用完全不同的对象替换它。@JamesThorpe我不确定您的注释与这段特定代码的相关性如何。您正在讨论其他内容。如果要对数组中的每个项进行变异,可以使用“forEach”,然后对每个元素调用一个变异方法。当您执行item=item+1时,无论您调用.map还是.forEach,您都不会对item进行变异,因为您只是重新分配了一个局部变量。如果您想对数组中的每个项进行变异,您可以使用“forEach”,然后对每个元素调用一个变异方法。当您使用item=item+1时,无论您调用.map还是.forEach,您都不会对item进行变异,因为您只是重新分配了一个局部变量。因此,您的意思是,如果这不是一个基元类型数组,那么该赋值将更改原始元素?为什么要以这种方式使用map?如果您不打算对返回的数组执行任何操作,那么您应该使用forEach。@Jonah是的,forEach可以执行此操作,但OP要求map,并想知道是否可以使用map@Jonah你错了。回调函数的变量始终引用数组中的原始项。如果更改此变量,由于引用的原因,如果数组中的原始变量不是基元类型,则它也会更改。通过代码项=项+1重新分配引用将丢失。例如,对于数组中的对象,原始对象会随着贴图而更改,如我在answer@Jonah通过执行item=item+1,可以重新分配并释放refe
法国。即使使用object,如果重新赋值,引用也会丢失,原始元素不会发生变化。那么,您是说,如果这不是一个基元类型数组,那么赋值将更改原始元素?为什么要以这种方式使用map?如果您不打算对返回的数组执行任何操作,那么您应该使用forEach。@Jonah是的,forEach可以执行此操作,但OP要求map,并想知道是否可以使用map@Jonah你错了。回调函数的变量始终引用数组中的原始项。如果更改此变量,由于引用的原因,如果数组中的原始变量不是基元类型,则它也会更改。通过代码项=项+1重新分配引用将丢失。例如,对于数组中的对象,原始对象会随着贴图而更改,如我在answer@Jonah通过执行item=item+1,可以重新分配和释放引用。即使使用对象,如果重新指定,也会丢失引用,并且原始引用不会发生变化