为什么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中测试时会发生这种情况,但到目前为止我还没有在其他浏览器中对其进行过测试。为什么会发生这种情况并在其他浏览器中发生?
答案 0 :(得分:2)
这只是因为数组(它是一个Object)是通过引用传递的,而原语则不是。请注意,从技术上讲,它是按值传递的,但在这种情况下,该值是参考,感谢 Esteban
对象通过引用自动传递,无需特别说明
如果将对象(即非原始值,如Array或用户定义的对象)作为参数传递,并且该函数更改了对象的属性,则该更改在函数外部可见,如下所示例如:
答案 1 :(得分:1)
是的...... JavaScript对象和数组(它们是对象)通过引用传递。但是你应该记得明确地阅读方法签名,因为一些数组方法不会改变原始数组但返回一个新数组。请仔细阅读MDN文档,了解相关方法。 Array.prototype.map()实际上会使原始数组保持原样并返回一个全新的数组,您需要将其设置为赋值给变量。