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的值没有改变?

阅读 315
评论
    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的值。

      • 11.8k

      arr为什么会改变呢,arr是一个变量,data也是一个变量

      先是arr = 1,然后data = arr,再data = 2,arr怎么会变成2呢

        你有些地方写错了

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

          登录后参与交流、获取后续更新提醒