猿问

在javascript中,数组显示“按值传递”行为而不是“按引用传递”

我知道数组是 javascript 中的一个对象,使其成为非原始数据类型,默认情况下使其成为通过引用传递。现在这在我遇到的大多数用例中都是正确的,但是我共享的代码显示了一种我不理解的奇怪行为,它似乎更像是“传递值类型”。


var arr = ['a','b','c']

/*

function addArr(ar){

    ar.push('d')

    return ar

}


console.log(addArr(arr))  // ['a', 'b', 'c', 'd']

console.log(arr)          // ['a', 'b', 'c', 'd']

*/


//the above output is expected behavior for an Array object




function changeArr(ar){


    console.log(ar)   //1-// ['a', 'b', 'c']

    ar = ['12','11']

    console.log(ar)   //2-// ['12', '11']

    return ar

}


console.log(changeArr(arr)) //3-// ['12', '11']

console.log(arr)            //4-// ['a', 'b', 'c']


//now I expect the forth console output to be  ['12','11'] here because it is an object


守着星空守着你
浏览 185回答 3
3回答

绝地无双

您基本上是重新分配对象而不是修改原始对象。ar = ['12','11']这就是 Javascript 重新分配新值的原因。

呼唤远方

请看评论。let arr = [1, 2, 3, 4];function changeArr(ar) {  //console.log(ar)  ar = ['12', '11'] // creating a new array ie creating a new space in heap putting these values there and storing its reference in ar or assigning it to the reference   //console.log(ar)  return ar}function changeArr2(ar) {  ar.push(55); // here we have changed the array  that is pointed by the reference stored in ar  return ar}console.log(changeArr(arr))console.log(changeArr2(arr));console.log(arr) // now the original array contains 55 too有关更清晰的图片,请看这里 - https://stackoverflow.com/a/57852144/7849549

12345678_0001

function changeArr(ar){&nbsp; &nbsp; console.log(ar)&nbsp; &nbsp; ar = ['12','11'] // <- THIS LINE RIGHT HERE&nbsp; &nbsp; console.log(ar)&nbsp; &nbsp; return ar}您正在创建一个新数组,而不是操作旧数组。每次调用该函数时,您都在创建一个新数组并返回新数组(如果您调用该函数 5 次,您将获得 5 个新数组)。您作为输入传递的那个是无关紧要的,并且保持不变。编辑您创建的新数组与作为输入传递的内容之间的唯一关系是它们在闭包内使用相同的变量名,因此,在该闭包内,您无法再访问输入和新数组同时。但那是另一个话题了...也许这会让它更清楚:var x = 'something that is not an array'console.log(changeArr(x));console.log(x);这也许会让一切变得最清楚:var arr = [1,2,3,4];console.log(changeArr());console.log(arr);
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答