以下代码段演示了数组的作用类似于引用
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
函数在处理数组时是否会创建数组的浅表副本,然后返回?
答案 0 :(得分:0)
map()
方法创建并返回一个新数组,其结果是在调用数组中的每个元素上调用提供的函数。
let arr = [1,2,3]
let arr2 = arr
arr = arr.map(x => x * 2)
这里,arr和arr2是两个不同的数组。
答案 1 :(得分:0)
arr2= arr
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方法遵循函数式编程范例,方法是将数组元素和数组本身保持不变,并将原始数据转换为新的集合。