2017-07-13 58 views
1

下面的代码片断表明阵列像引用数组引用的规则是什么?

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


arr[0] = 5 


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

然而,当我使用映射功能来编辑的数组:

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

[来自MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map):map()方法创建一个包含结果的新数组在调用数组中的每个元素上调用一个提供的函数。 –

+1

阅读文档 – Weedoze

回答

0

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

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

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

这里,ARR和ARR2是两个不同的阵列。

0
  1. 地图创建新的数组,所以你可以在地图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 ]

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方法遵循函数式编程范例,方法是将数组元素和数组本身保持不变,并将原始数据转换为新集合。