Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/477.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 更改本地范围内的数组成员将更改全局范围内的成员_Javascript_Google Chrome_Scope - Fatal编程技术网

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

为什么JavaScript对待数组的范围与对待其他变量的范围不同?通常,如果将全局范围中的变量作为参数传递到函数中,则该变量是局部变量,在函数中更改该变量不会更改全局变量的值。例如:

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传递。在任何情况下,解决方法都是首先克隆阵列。谢谢你的回答!为了清楚起见,请查看以下内容: