函数传参到底变不变?
var change = (arr) => {
arr=[];
}
var foo = [1,2,3];
change(foo)
console.log(foo);
为什么还是[1,2,3],不应该是[];
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
var change = (arr) => {
arr=[];
}
var foo = [1,2,3];
change(foo)
console.log(foo);
为什么还是[1,2,3],不应该是[];
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(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不会改变。
其实改变引用是会变的
你这里arr只是个形参,只是对形参做了操作,相当于根本没有更改原来的foo。
好比你有一份作业
你邻居小明抄袭了一份
拿走了
写上自己的名字
至于最后他修改没修改答案 跟你没有任何关系
例如如下方式,引用地址指向同一块内容,此时修改局部变量才会影响全局的。
上面说了这么多,其实牵扯的就是一个问题:
js参数是值传递?引用传递?
建议题主去搜这类的文章,文章里说的会比我们答的详细
你这不是js问题!是编程基础问题!
改一下你写的
原因是js参数是值传递
这里形参
arr
指向的是一块内存地址,这个地址和foo
指向的地址是同一块,相当于arr = foo
。引用类型直接赋值不就是指向同一块地址么,所以直接操作
arr
,foo
也会变。但是如果是
arr = []
,那么arr
就指向别的地址了,foo指向的还是原来的数组。如果是引用传递,那么
arr
变为[]
,foo
也会为空,因为他们的引用都变了。