javascript 为什么arr数组没有被赋值?

var arr=[1,2];
var arr0=[{a:1,b:2}];
function fun(data){
    data = arr0
}
fun(arr);
console.log(arr)    //[1,2]

问题:调用函数后arr的值不是应该改变的吗?为什么arr的值没有改变?

阅读 366
评论
    3 个回答

    知识点三个:
    1.形参和实参
    2.函数作用域
    3.值类型和引用类型

    函数定义的时候,也就是你这里的data,是一个形参;函数调用时,也就是你这里传入的arr,是实参。

    在函数执行时,会形成一个新的作用域,形参data就定义在新的作用域中, 传入的实参arr是一个赋值的操作,可以这样理解:

    // 函数执行时,开辟了一块新的内存空间:
    var data = arr

    因为arr是引用类型,所以其实data和arr指向同一块堆内存。

    而在函数内部,接着会执行赋值的操作:

    var data = arr
    
    data = arr0

    arr0也是一个引用类型,所以此时,函数内部的data,又会将它的真实地址指向了另一块堆内存,也就是和arr0是同一块堆内存。

    所以到这一步,其实逻辑是这样的:
    1.data先是和arr指向同一块内存
    2.data又和arr0指向同一块内存,此时data就和实参arr断了关系了。
    所以函数执行完,其实不会影响实参arr。

    所以,题主补充的,在函数内部,给data[0]等重新赋值,此时data和arr还是有关系的,所以会影响外面实参arr的值。