Javascript 更改本地范围内的数组成员将更改全局范围内的成员
为什么JavaScript对待数组的范围与对待其他变量的范围不同?通常,如果将全局范围中的变量作为参数传递到函数中,则该变量是局部变量,在函数中更改该变量不会更改全局变量的值。例如:Javascript 更改本地范围内的数组成员将更改全局范围内的成员,javascript,google-chrome,scope,Javascript,Google Chrome,Scope,为什么JavaScript对待数组的范围与对待其他变量的范围不同?通常,如果将全局范围中的变量作为参数传递到函数中,则该变量是局部变量,在函数中更改该变量不会更改全局变量的值。例如: var globalInt = 1; function test1(x){ x = x + 1 } test1(globalInt); console.log(globalInt); //globalInt is still 1 但是,在传递值数组时,似乎不适用相同的情况 var globalArray
var globalInt = 1;
function test1(x){
x = x + 1
}
test1(globalInt);
console.log(globalInt); //globalInt is still 1
但是,在传递值数组时,似乎不适用相同的情况
var globalArray = ["TEST"];
function test(x){
x[0] = x[0].toLowerCase()
}
test(globalArray);
//globalArray is now ["test"] instead of ["TEST"]
console.log(globalArray[0]);
当我在Chrome中测试时,这种情况就会发生,但到目前为止,我还没有在其他浏览器中测试过。为什么会发生这种情况以及在其他浏览器中会发生这种情况?这只是因为数组(对象)是通过引用传递的,而原语不是。请注意,从技术上讲,它是通过值传递的,但在这种情况下,值是一个引用,这要感谢Esteban 对象是通过引用自动传递的,无需特别声明它 如果将对象(即非基本值,如数组或用户定义的对象)作为参数传递,并且函数更改了对象的属性,则该更改在函数外部可见,如以下示例所示:
是的。。。JavaScript对象和数组(即对象)通过引用传递。但是您应该记住显式读取方法签名,因为某些数组方法不会更改原始数组,而是返回一个新的数组。仔细阅读MDN文档,了解所讨论的方法。实际上,Array.prototype.map()将保持原始数组不变,并返回一个全新的数组,您需要将该数组设置为分配给变量 从技术上讲,它仍然是通过值传递的。本例中的值恰好是对数组的引用。嗯。。。看起来,如果JavaScript将通过ref隐式传递变量,那么应该有一种方法根据需要显式地通过val或ref传递。在任何情况下,解决方法都是首先克隆阵列。谢谢你的回答!为了清楚起见,请查看以下内容: