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

阅读 3.2k
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的值。

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]
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题