版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/baidu_36065997/article/details/79097135
- 简单类型,主要是2种参数传递方式,就是值传递和引用传递。
- 复杂类型,实际上有3种传递方式,是值传递、引用复制传递和引用传递。
值传递
在向参数传递基本类型的值时,被传递的值会被复制给一个局部变量。
例子
var count = 20;
var result = addTen(count);
alert(count); //结果:20
alert(result); //结果:10
function addTen(num){
num+=10;
return num;
}
在函数addTen()有一个参数num,在调用这个函数时,变量count作为参数被传递给函数,这个变量值是20。
因此,20就被复制给参数num以便在addTen()函数中使用。
在函数内部,num被加上了10,这一操作不会影响外部的count。
参数num和变量count互不相识,仅仅是有相同的值。
结论:
值传递,传递的仅仅是值,不会影响原来的参数。
引用复制传递(reference-copy)
在向参数传递引用类型的值时,会把这个值在内存中的地址的值复制给一个局部变量。
例子:
var person = new Object();
setName(person);
alert(person.name); //结果:'grace'
function setName(obj){
obj.name='grace';
obj = new Object();
obj.name='alice';
}
在函数setName()有一个参数obj,在调用这个函数时,变量person作为参数被传递给函数,这个变量是一个Object对象。
因此,person所在的地址的值就被传递给obj以便在setName()函数中使用。
在函数内部,因为传递的是地址,修改成员对象会直接影响原对象;又因为修改的是复制后的地址值,所以如果将对象重新赋值,不影响原对象。
结论:
引用复制传递,传递的是地址的值,修改成员对象会影响原对象,但对变量重新赋值,不会影响原对象。
引用传递
在JS中没有引用传递,但像c# 中的 ref 关键字、php 中的 & 等等都使用的引用传递。
在向参数传递引用类型的值时,会把这个值在内存中的地址复制给一个局部变量。
结论:无论是对于变量成员的修改,还是对变量重新赋值,都会影响到原对象。
扫描二维码关注公众号,回复:
3459756 查看本文章
参考文献:
1.https://www.zhihu.com/question/51018162/answer/124015162
2.JavaScript高级程序设计