如何在函数中重新分配非原语(Javascript)?[duplicate]

roejwanj  于 2022-12-17  发布在  Java
关注(0)|答案(2)|浏览(111)

此问题在此处已有答案

(33个答案)
17小时前关门了。
当在函数中重新分配非原语时,通过引用传递是如何工作的?
例如:

var a = [9]; //suppose this is stores at 0x01

function changeto5(array){ 
array = [5]; 
}

function(a);//passes the address 0x01
console.log(a) //outputs [9]

存储器地址0x01的值不应该更新为[5]吗?我很困惑为什么不更新。我目前对这个问题的理解是,地址0x01存储的是[9]的值。且使用新地址(例如0x02)来存储[5]。但这意味着没有办法改变存储在0x01中的值,除非在相同的作用域中完成,这似乎是不一致的,因为你可以在函数中改变数组的元素,我目前的理解正确吗?

qf9go6mv

qf9go6mv1#

你的直觉几乎百分之百正确。

  • 是的,当调用[5]时,您正在示例化一个新数组
  • 要使用相同的数组“at 0x01”,您需要使用array.pop()array.push()函数。
  • 或者,您可以通过将数组长度设置为0(例如array.length = 0)来清除该数组
  • 编辑:或者你可以直接访问数组的元素,就像下面spectric的回答一样,例如:array[0] = 5

这样,您就不会示例化新数组,而是使用现有数组。

wljmcqd8

wljmcqd82#

您正在替换函数中的数组,这只会影响函数范围内的数组。函数之外的数组仍然保持不变。
这是因为非原语并不是真的通过引用传递的--而是复制引用,所以在幕后,修改参数的内容将持续,但覆盖“引用”不会影响原始内容。
因此,如果引用该数组,将看到预期的输出:

var a = [9]; //suppose this is stores at 0x01

function changeto5(array){ 
  array[0] = 5
}

changeto5(a);//passes the address 0x01
console.log(a) //outputs [5]

相关问题