首页 > 一段代码,,为啥hello不会替换arr?

一段代码,,为啥hello不会替换arr?

var arr=[1,2,3,4,5];
function fn(arr){

arr[0]=100;
arr="hello";

}
console.log(fn(arr));


贴代码的时候注意标点符号...

var arr=[1,2,3,4,5];
function fn(arr){
  arr[0]=100;
  arr="hello";
  return arr;//没有返回值得时候你是怎么打印出来的?
}
console.log(fn(arr));//hello

结果没问题,arr的值是"hello",不知道你怎么测试的?


当函数参数是字符串进行的是值传递,字符串只在函数内部变化,字符串本身不变化。而当参数是数组的时候,传递的是数组的指针,数组本身值会发生改变。


你就这样理解吧,这个fn函数里的arr是函数里重新声明的一个变量,负责接收你给的值,只是和外面的数组对象有一样的名字罢了。所以你使用arr[0],操作的确实是外围的数组对象,也就是改了第一个值。但是如果直接arr="hello"最多也就是给你自己声明的变量arr设了值等于hello而已,并未改变arr数组对象的值


这仅仅是函数参数传递问题,和作用域没关系。js参数传递方式是值传递,对于对象参数传递的是对象引用的copy,所以你修改的只是arr引用的copy指向的值,原来的arr的引用并不会修改。


主要是作用域问题的理解

var arr=[1,2,3,4,5];//arr的作用域是windows

function fn() {arr}//fn中的arr 的作用域是fn,JavaScript中的变量值是向上寻找的,这里的arr的值你在fn中已经定义为hello,在fn中已经被找到,所以hello不会被替换

你的代码中因为fn没有return,console.log(fn(arr))也是undefined


两句话可以解决:
1.函数参数相当于声明变量
2.如果将对象传递给函数,则传递的是对象的地址

还有你没有return默认返回undefined,所以无论如何你得到的都是undefined

【热门文章】
【热门文章】