更改本地范围内的数组成员会更改全局范围

时间:2016-04-25 22:44:17

标签: 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 = ["TEST"];

function test(x){
    x[0] = x[0].toLowerCase()
}

test(globalArray);

//globalArray is now ["test"] instead of ["TEST"]
console.log(globalArray[0]);

当我在Chrome中测试时会发生这种情况,但到目前为止我还没有在其他浏览器中对其进行过测试。为什么会发生这种情况并在其他浏览器中发生?

2 个答案:

答案 0 :(得分:2)

这只是因为数组(它是一个Object)是通过引用传递的,而原语则不是。请注意,从技术上讲,它是按值传递的,但在这种情况下,该值是参考,感谢 Esteban

  

对象通过引用自动传递,无需特别说明

     

如果将对象(即非原始值,如Array或用户定义的对象)作为参数传递,并且该函数更改了对象的属性,则该更改在函数外部可见,如下所示例如:

MDN Link

答案 1 :(得分:1)

是的...... JavaScript对象和数组(它们是对象)通过引用传递。但是你应该记得明确地阅读方法签名,因为一些数组方法不会改变原始数组但返回一个新数组。请仔细阅读MDN文档,了解相关方法。 Array.prototype.map()实际上会使原始数组保持原样并返回一个全新的数组,您需要将其设置为赋值给变量。