ECMAScript中所有函数的参数都是按值传递的

版权声明:本文为博主原创文章,未经博主允许不得转载。 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高级程序设计

猜你喜欢

转载自blog.csdn.net/baidu_36065997/article/details/79097135
今日推荐