数组引用的规则是什么?

时间:2017-07-13 13:41:47

标签: javascript

以下代码段演示了数组的作用类似于引用

let arr = [1,2,3]
let arr2 = arr


arr[0] = 5 


console.log(arr2) // [5, 2, 3]
console.log(arr)  // [5, 2, 3]

但是,当我使用map函数编辑数组时:

let arr = [1,2,3]
let arr2 = arr

arr = arr.map(x => x * 2) 

console.log(arr2) //[ 1, 2, 3 ]
console.log(arr)  //[ 2, 4 ,6 ]

它不作为参考。我希望它表现得像这样:

let arr = [1,2,3]
let arr2 = arr

function doubleNumbers(numbers){
  for (let i = 0; i < numbers.length; i++) {
    numbers[i] = numbers[i] * 2
  }
  return numbers
}

arr = doubleNumbers(arr)

console.log(arr2) //[ 2, 4 ,6 ]
console.log(arr)  //[ 2, 4 ,6 ]

.map .filter .reduce .forEach函数在处理数组时是否会创建数组的浅表副本,然后返回?

3 个答案:

答案 0 :(得分:0)

map()方法创建并返回一个新数组,其结果是在调用数组中的每个元素上调用提供的函数。

let arr = [1,2,3]
let arr2 = arr

arr = arr.map(x => x * 2)

这里,arr和arr2是两个不同的数组。

答案 1 :(得分:0)

  1. 地图创建新数组,以便您可以在地图arr2= arr
  2. 之后进行分配

    let arr = [1,2,3]
    
    arr = arr.map(x => x * 2) // return with new array
    
    var arr2 = arr  //declare only after map other wise its target the old
    
    console.log(arr2) //[ 1, 2, 3 ]
    console.log(arr)  //[ 2, 4 ,6 ]

答案 2 :(得分:0)

Array.prototype.map不会修改数组。相反,它使用提供的方法将元素投影到新数组中。为了理解它为什么会这样做,可以将其分解为一个实现:

  Array.prototype.map = function (projection) {
    var mapped = []; // New array
    for(var i = 0; i < this.length; i++) {
      mapped.push(projection(this[i]); // Project item into new array
    }

    return mapped; // Return new array
  }

请注意未修改原始数组的项目。 map方法遵循函数式编程范例,方法是将数组元素和数组本身保持不变,并将原始数据转换为新的集合。