2017-07-13 33 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方法遵循函數式編程範例,方法是將數組元素和數組本身保持不變,並將原始數據轉換爲新集合。