var change = (arr) => {
arr=[];
}
var foo = [1,2,3];
change(foo)
console.log(foo);
为什么还是[1,2,3],不应该是[];
var change = (arr) => {
arr=[];
}
var foo = [1,2,3];
change(foo)
console.log(foo);
为什么还是[1,2,3],不应该是[];
其实改变引用是会变的
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]
例如如下方式,引用地址指向同一块内容,此时修改局部变量才会影响全局的。
var change = (test) => {
test.foo = [];
}
var test={foo : [1,2,3]};
change(test)
console.log(test.foo);//输出[]
改一下你写的
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
。
引用类型直接赋值不就是指向同一块地址么,所以直接操作arr
,foo
也会变。
但是如果是arr = []
,那么arr
就指向别的地址了,foo指向的还是原来的数组。
如果是引用传递,那么arr
变为[]
,foo
也会为空,因为他们的引用都变了。
10 回答11.2k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
var foo = [1, 2, 3]
分配一段内存保存1,2,3
把这段内存的地址放在foo
里,foo
只是记录这段内存在哪里,而不做保存其他的。change(foo)
把上面那段标记的值传递给形参arr
,这里是传值而已。arr = []
分配一段内存,啥都没保存,把这段内存的标记赋值给arr
,这样,
foo
里还是标记的那个地址。如果,改为
arr[1] = 10;
这样,是指arr
标记的内存(也就是foo标记的内存)的第一个赋值为 10这样
foo
的值就可以改变了