**
js函数传参是按值传递还是按引用传递?
**
摘要
首先,得知道什么是值传递和引用传递吧。先上概念,百度百科写到:
值传递:在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。
引用传递:在调用函数时将实际参数的地址传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。
结论
看完上面那个概念,老司机们应该已经得出结论:如果函数传递的是基本数据类型,那么就是值传递;如果函数传递是引用类型,那么就是引用传递。
值传递
来看看值传递的例子吧:
var a = 10
function add(num){
num+=10
}
add(a)
console.log(a);//10
运行上面代码就知道啦,打印是10。执行add(a)的时候,会复制一份值给函数的arguments这伪数组,当然同时也是num这个命名参数。arguments[0] = num,函数内部对num进行了加操作,num = 20了。但是外部最后输出a时,仍然是10,说明a与函数内部的num互不干扰。因为是复制了内存中的一份值给num,所以内部对num的操作不影响全局变量a的值。如果传递参数的是string类型或者boolean类型,也是这么个结论:如果函数传递的是基本数据类型,那么就是值传递
不信你自己试试,代码就不上了
引用传递
先看看例子:
var obj={name:'jin'};
function change(o){
o.name='mu';
}
change(obj);
console.log(obj.name)
运行上面代码就知道啦,打印是‘mu’。根据查找的资料了解到,函数里面只是把实际参数复制一份作为形参,但是根据这个打印结果就知道,复制是复制了,可是也只是一个浅复制,浅复制的话,只是复制了栈指向地址,那么你改变了形参,实参也跟着改变。
结论:如果函数传递是引用类型,那么就是引用传递。
**
结束语
**
小小码农,如果说的不对,请指教。
写这篇文章前,已经查阅了很多资料,各种百度,最后是先找百度百科里的值传递和引用传递概念,然后再靠查阅的资料和自己的理解写了这篇文章。如果你直接百度‘js函数传参是按值传递还是按引用传递?’,那你会像我一样(怎么他们把这概念说得这么不清,而且前面的一顿乱七八糟说的都没有结论,看完整篇文章还质疑了:他们说的可信吗)
如果对我的这个结论还有质疑,那先质疑百度百科给我的值传递和引用传递概念😄。