2016-03-05 86 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'的第一个值。 –