为什么这个map函数不会改变原始数组中的值?

时间:2018-01-09 11:00:45

标签: javascript arrays ecmascript-6

以下是相关代码:

const array = [
  1, 2, 3
]

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

console.log(array)

我认为item方法中的map(第一个)参数是对数组中原始项的引用,并且直接改变它会改变第一个数组的内容。那不是真的吗?

3 个答案:

答案 0 :(得分:3)

map函数返回一个新数组,它不会改变原来的数组。

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

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

array.forEach((item, index) => {
    array[index] = item + 1;
});

答案 1 :(得分:3)

您的数组包含基元类型元素(此处为整数)。类型原语的变量不能通过其引用进行变异。如果例如数组的元素是对象,则可以进行变异,如下所示:

let tappedNode = self.sceneView.hitTest(gesture.location(in: gesture.view), options: [:])

if !tappedNode.isEmpty {
  let node = tappedNode[0].node 
  node.removeFromParent()
  } else { 
 // add my new node
}

答案 2 :(得分:1)

Mozilla说;

  

map()方法创建一个新数组,其中包含调用a的结果   为调用数组中的每个元素提供了函数。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map

因此,map函数不会改变数组的值。

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



const array = [
  1, 2, 3
]

array.map((item, k) => {
  array[k] = item + 1
})

console.log(array)