函数传参到底变不变?

发布于 2022-09-05 22:19:11 字数 146 浏览 42 评论 0

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

console.log(foo);

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(11

踏月而来 2022-09-12 22:19:12

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

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

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

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

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

乙白 2022-09-12 22:19:12

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

笛声青案梦长安 2022-09-12 22:19:12

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

百善笑为先 2022-09-12 22:19:12
var change = () => {
    foo = [];
}
var foo = [1,2,3];
change(foo) 

console.log(foo);
初见 2022-09-12 22:19:12

其实改变引用是会变的

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]
北陌 2022-09-12 22:19:12

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

花桑 2022-09-12 22:19:12

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

最好是你 2022-09-12 22:19:12

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

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

console.log(test.foo);//输出[]
如果没结果 2022-09-12 22:19:12

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

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

好倦 2022-09-12 22:19:12

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

梦行七里 2022-09-12 22:19:12

改一下你写的

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也会为空,因为他们的引用都变了。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文