在这种情况下,Javascript通过引用而不是值传递?



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

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"数组的值已通过引用更改。我在这里误解了什么?谢谢。

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

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

假设我们有一个数组

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"]

希望这能澄清你的理解。

在断开的函数中,您的参数是数组引用,并且您传递了两个变量值

所以编译器与类型混淆

最新更新