此问题在此处已有答案:
(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中的值,除非在相同的作用域中完成,这似乎是不一致的,因为你可以在函数中改变数组的元素,我目前的理解正确吗?
2条答案
按热度按时间qf9go6mv1#
你的直觉几乎百分之百正确。
[5]
时,您正在示例化一个新数组array.pop()
和array.push()
函数。array.length = 0
)来清除该数组array[0] = 5
这样,您就不会示例化新数组,而是使用现有数组。
wljmcqd82#
您正在替换函数中的数组,这只会影响函数范围内的数组。函数之外的数组仍然保持不变。
这是因为非原语并不是真的通过引用传递的--而是复制引用,所以在幕后,修改参数的内容将持续,但覆盖“引用”不会影响原始内容。
因此,如果引用该数组,将看到预期的输出: