首页 > 解决方案 > 在这种情况下,Javascript 通过引用而不是值传递?

问题描述

我一直认为 javascript 是一种按值传递语言(其中所有函数参数的副本都在函数中使用,而不是通过引用编辑外部变量)所以我很震惊地发现运行下面的代码会改变外部变量'一个人的价值。

var one = [1];
var two = [2];

function broken(arr1, arr2) {
  arr1[0] = arr2[0];
  return arr1;
}

document.write("One: " + one + "<br>");
document.write("Two: " + two + "<br>");

document.write("Run 'broken': " + broken(one, two) + "<br>");

document.write("One: " + one + "<br>");
document.write("Two: " + two + "<br>");

产生这个输出:

> One: 1
> Two: 2
> Run 'broken': 2
> One: 2    //<------- this line
> Two: 2

如您所见,“one”数组的值已通过引用更改。我在这里有什么误解?谢谢。

标签: javascriptreference

解决方案


破坏函数的行为是正确的。

就像对象属性一样,如果您修改数组的值(而不是数组本身),它将修改原始值。

假设我们有一个数组

letters = ['A','C']

function willNotModify(array) { 
  array = ['A','Z']
}

function willModify(array) {
  array[1] = 'B'
}

willNotModify(letters) // letters array is unchanged 
willModify(letters)    // letters array is now ["A", "B"]

希望这能澄清你的理解。


推荐阅读