函数传参到底变不变?

var change = (arr) => {
    arr=[];
}
var foo = [1,2,3];
change(foo) 

console.log(foo);

为什么还是[1,2,3],不应该是[];

阅读 5.5k
11 个回答

var foo = [1, 2, 3] 分配一段内存保存1,2,3 把这段内存的地址放在foo里,foo只是记录这段内存在哪里,而不做保存其他的。

change(foo)把上面那段标记的值传递给形参arr,这里是传值而已。

arr = [] 分配一段内存,啥都没保存,把这段内存的标记赋值给arr,

这样,foo里还是标记的那个地址。

如果,改为arr[1] = 10; 这样,是指 arr标记的内存(也就是foo标记的内存)的第一个赋值为 10
这样foo的值就可以改变了

如果你在函数重写了形式参数,那这个参数就变成局部变量了。

arr是局部变量,foo是全局变量。改变了arr,foo不会改变。

var change = () => {
    foo = [];
}
var foo = [1,2,3];
change(foo) 

console.log(foo);

其实改变引用是会变的

function change(a){
    a.a = 2 //a[0] = 8
}
var obj = {a:1};//或者 [0,1,2]
change(obj);
console.log(obj)//{a:2} 或者 [8,1,2]

你这里arr只是个形参,只是对形参做了操作,相当于根本没有更改原来的foo。

好比你有一份作业
你邻居小明抄袭了一份
拿走了
写上自己的名字
至于最后他修改没修改答案 跟你没有任何关系

例如如下方式,引用地址指向同一块内容,此时修改局部变量才会影响全局的。

var change = (test) => {
    test.foo = [];
}
var test={foo : [1,2,3]};
change(test) 

console.log(test.foo);//输出[]

上面说了这么多,其实牵扯的就是一个问题:js参数是值传递?引用传递?

建议题主去搜这类的文章,文章里说的会比我们答的详细

你这不是js问题!是编程基础问题!

改一下你写的

var change = (arr) => {
    arr.push(4); //改的这里
}
var foo = [1,2,3];
change(foo) 

console.log(foo);

--> [1,2,3,4]

原因是js参数是值传递

这里形参arr指向的是一块内存地址,这个地址和foo指向的地址是同一块,相当于arr = foo

引用类型直接赋值不就是指向同一块地址么,所以直接操作arrfoo也会变。

但是如果是arr = [],那么arr就指向别的地址了,foo指向的还是原来的数组。

如果是引用传递,那么arr变为[]foo也会为空,因为他们的引用都变了。

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