函数中新建数组的问题
var arr=[1,2,3];
function change(arr){
arr=new Array(100,200,300);
}
change(arr);
console.log(arr[0]);

我知道最后arr[0]输出是1,可是change(arr)中已经给新的数组赋值了,那用什么表示新的数组呢,名字都是arr啊

2个回答

change(arr)中新赋值的是局部变量arr,全局变量arr没有改变

回复:
js中对象和数组是按引用地址传递的。
当把一个数组从一个变量传递到另一个变量中时,两个变量都指向这同一个数组的引用地址。

var a=["a","b","c"];
var b=a; //a和b变量都指向同一个数组的引用地址。

当对数组的元素赋值时,实际上是先读取变量中的引用地址找到数组,再改变这个数组的元素。
这样之后再用另一个变量中的引用地址所找到的也是这同一个数组,会获取到一样的数组内容。

b[1]="f";
alert(b); //输出 a,f,c
alert(a); //输出 a,f,c

但是这种引用只在读取变量时有效,当对变量重新赋值时,原有的引用就会断开。

b=["x","y","z"]; //b变量重新指向一个新数组的引用地址。不会影响到a变量。
alert(b); //输出 x,y,z
alert(a); //输出 a,f,c
weixin_42816469
WuXianSen666 回复天际的海浪: 谢谢
一年多之前 回复
jslang
天际的海浪 回复WuXianSen666: 回答已更新
一年多之前 回复
weixin_42816469
WuXianSen666 回复天际的海浪: 可是我在函数中修改修改数组的值,最后在函数外输出也是修改过得,是因为没在函数中定义新变量,所以一直用的是全局变量吗?
一年多之前 回复
jslang
天际的海浪 回复weixin_42816469: 局部变量和全局变量可以同名。 console.log(arr[0])写在change()里就是输出函数里的局部变量
一年多之前 回复
weixin_42816469
WuXianSen666 那如果console.log(arr[0])写在change(arr)里呢?
一年多之前 回复

变量有函数作用域,在函数里的变量如果和外面的变量同名,函数里使用的函数里的变量,这个变量是局部变量,改变这个局部变量并不影响外面的变量。

你可以这样实现你的功能:

var arr=[1,2,3];
function change(){
    return new Array(100,200,300);
}
arr=change();
lonely_feather
下羽 可以啊,但是在局部作用域内只能操作局部变量
一年多之前 回复
weixin_42816469
WuXianSen666 局部变量和全局变量可以用一个名字吗
一年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐