2016-03-05 79 views
2

正如我的理解,使用Javascript傳遞對象通過引用,和一個陣列還一個目的,但是當我創建整數的數組,然後將它傳遞給函數,如下面的代碼:Javascript是否通過引用或值傳遞數組?

function testFunc(outTestArray) { 
    var aiTemp = [1,2,3,4]; 

    /*Using slice(0) to clone array */ 
    outTestArray = aiTemp.slice(0); 
} 

var aiTest = Array.apply(null, Array(4)).map(Number.prototype.valueOf, 0); 
testFunc(aiTest); 

console.log(aiTest.toString()); // aiTest still [0,0,0,0] 

我也知道,切片( 0)函數只是返回一個數組的淺拷貝,但如果數組只是一個整數數組。所以我的問題是爲什麼aiTest的數據沒有被修改?

+1

http://stackoverflow.com/questions/518000/is-javascript-a-pass-by-reference-or-pass-by-value-language –

+1

重複。簡短回答:Javascript總是按值傳遞,除了數組/對象。 –

+1

JavaScript始終是按值(複製)。儘管對象的值是一個參考(按值參考)。 [JavaScript是傳遞引​​用還是傳值語言?](https://stackoverflow.com/questions/518000/is-javascript-a-pass-by-reference-or-pass-by-value -language)你期待的是一個指針,其中'outTestArray'指向JavaScript所沒有的'aiTest'。 –

回答

0

你的錯誤是你的淺拷貝概念是錯誤的。

淺拷貝拷貝數組的內容,但不拷貝數組成員引用的東西。

如果你的數組是一個對象引用的數組,那麼淺拷貝將複製引用,所以你的新數組會指向相同的基礎對象。但是這個數組是int。整數本身通過淺拷貝複製。

+0

正如你所說「整本書本身被淺拷貝複製。」是的,我知道這一點。但是這與aiTest爲什麼在功能失效後沒有改變沒有關係? –

+1

數組通過reference_的_copy傳遞。 testFunc的outTestArray是對底層數組的引用。您的aiTemp賦值將_reference_設置爲指向新數組[1,2,3,4]。然後你出於某種原因複製。你不修改引用後面的數組,你正在修改_reference本身_ –

+0

要清楚,你可以通過做一些改變它的方式修改底層數組,比如'outTestArray [0] = 1'。這會修改你的'aiTest'的第一個值。 –