2015-08-28 43 views
0

我讀數據結構與算法使用JavaScript通過O'reily和參考VS陣列通過看重它規定如下:陣列通過在Javascript

淺拷貝(兩個數組指向內存中的相同位置):

var nums = []; 
for (var i = 0; i < 100; ++i) { 
nums[i] = i+1; 
} 
var samenums = nums; 
nums[0] = 400; 
print(samenums[0]); // displays 400 

深副本:

function copy(arr1, arr2) { 
for (var i = 0; i < arr1.length; ++i) { 
arr2[i] = arr1[i]; 
} 
} 

現在下面的代碼片段將產生預期的結果:

var nums = []; 
for (var i = 0; i < 100; ++i) { 
nums[i] = i+1; 
} 
var samenums = []; 
copy(nums, samenums); 
nums[0] = 400; 
print(samenums[0]); // displays 1 

爲什麼創建深度副本需要一個功能?

+0

'爲什麼是爲了創建深副本所需的功能' - 因爲這是怎麼了? JavaScript的作品,改變它會打破網絡 –

+2

該功能不是必需的,它只是美觀性和可重用性 –

+1

它不是真正的兩個數組。你的「淺拷貝」根本不是一個副本。而不是「*兩個數組指向內存中的同一位置*」,我們討論*兩個變量指向(或:保持)相同的數組*。如果你想要一個,你可以明確地創建一個新的數組,例如通過'.slice()'或你的'copy([],...)'函數。 – Bergi

回答

1

正如評論中所述,該功能純粹是爲了美學和可重用性,並非絕對必要。

你可以重構你的例子:

function copy(arr1, arr2) { 
    for (var i = 0; i < arr1.length; ++i) { 
     arr2[i] = arr1[i]; 
    } 
} 

var nums = []; 
for (var i = 0; i < 100; ++i) { 
    nums[i] = i+1; 
} 
var samenums = []; 
copy(nums, samenums); 
nums[0] = 400; 
print(samenums[0]); // displays 1 

到該等效功能少例如:

var nums = []; 
for (var i = 0; i < 100; ++i) { 
    nums[i] = i+1; 
} 
var samenums = []; 
for (var i = 0; i < nums.length; ++i) { 
    samenums[i] = nums[i]; 
} 
nums[0] = 400; 
print(samenums[0]); // displays 1