参数传值
JavaScript中参数传值都是按值传递的,即函数外部的值复制给函数内部的参数,
对于基本类型的值就如同基本类型的变量复制一样,直接赋值;
引用类型值的传递如引用类型的变量复制一样,复制引用类型指针位置给参数;
按值传递&按引用传递
按指传递:传递的是值的拷贝,也就是说传递后就互不相关了;
按引用传递:传递的是值的引用,也就是说传递前和传递后都指向同一个引用(也就是同一个内存空间)。
基本类型传值实例:
function add(num) {
num += 10;
return num;
}
let count = 10;
let result = add(count);
console.log(count) // 10,无变化
console.log(result) // 20
基本类型参数传值很好理解,此处传入的count只是将值传给num,num获得值后就与count没有关系了;
引用类型参数传值实例
function setName(obj){
obj.name = "CSDN";
}
let person = {};
let result = setName(person);
console.log(person.name) // CSDN
以上代码创建了一个对象将其保存在person
中,然后变量被传递到setName()中后就将person
指针复制给了obj
,因此在函数内部obj
和person
引用的是同一个变量,他们将访问同一个变量,因此函数内部修改obj外部会有反应。
这里有歧义的是: 有些人会认为在局部作用域中修改的对象在全局作用域中能反映出来,因此引用类型的传值是按引用传值。在理解之前先了解一下什么是按引用传值。
那么请看一下下面的例子:
function setName(obj){
obj.name = "按值传递";
obj = {};
obj.name = "按引用传递"
}
let person = {};
let result = setName(person);
console.log(person.name) // 按值传递
此处obj接收的person的指针位置,但是这个指针位置变量是以值的形式传递,所以在函数内部修改obj的值后(不包括修改obj对象属性的值),obj绑定的值就改变了,不再指向person。
如果是按引用传值,那么obj应该永远指向person的指针地址,那么最后应该输出”按引用传递“。