为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

守着星空守着你 2021-11-04 10:39:47
我知道数组是 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 objectfunction 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
查看完整描述

3 回答

?
绝地无双

TA贡献1946条经验 获得超4个赞

您基本上是重新分配对象而不是修改原始对象。

ar = ['12','11']

这就是 Javascript 重新分配新值的原因。


查看完整回答
反对 回复 2021-11-04
?
呼唤远方

TA贡献1856条经验 获得超11个赞

请看评论。


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


查看完整回答
反对 回复 2021-11-04
?
12345678_0001

TA贡献1802条经验 获得超5个赞

function changeArr(ar){


    console.log(ar)

    ar = ['12','11'] // <- THIS LINE RIGHT HERE

    console.log(ar)

    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);


查看完整回答
反对 回复 2021-11-04
  • 3 回答
  • 0 关注
  • 184 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信