今天我们要来探讨JS到底是透过何种参数传递方式呢?

 

废话不多说,上示例!!

 

我们先声明原始型别和物件型别来看看两者是否会有不一样的差异:

 

var myStr = 'Hola';

var myObj = {name:'Ann'};

再来,声明另一个变量去复制他们:

 

var myStr = 'Hola';

var myObj = {name:'Ann'};

 

var copyStr = myStr;

var copyObj = myObj;

然后,去修改复制过的变量内容并印出所有作比较:

 

var myStr = 'Hola';

var myObj = {name:'Ann'};

 

var copyStr = myStr;

var copyObj = myObj;

 

copyStr =“Im change!!“;

copyObj.name = 'Pandora';

 

console.log(myStr);//Hola

console.log(copyStr);//Im change!!

 

console.log(myObj);//{name:“Pandora”}

console.log(copyObj);//{name:“Pandora”}

恩?怎么会两个行别的结果会不一样呢!

 

那这样到底是哪一种参数传递方式啊!!

 

在估狗浩瀚的大海下寻找了很久,发现JS的圣经ECMAScript并没有说明他到底是使用何种参数传递方式,

不过大部分人认为是Call by sharing。

 

好,但这还是不能解释为什么myStr不等于copyStr啊!

这怎么看都像Call by value吧。

后来发现MDN在JS在基本型别有说明到:

 

所有的基本型别都是不可变的(immutable),即不可修改的。

 

所以在复制基本型别的值时候回直接给予一个新的值,而不是参考原本的值。

 

再回到我们一开始的示例来看:

 

var myStr = 'Hola';

var myObj = {name:'Ann'};

 

var copyStr = myStr;

var copyObj = myObj;

 

copyStr =“Im change!!“;

copyObj.name = 'Pandora';

 

console.log(myStr);//Hola

console.log(copyStr);//Im change!!

 

console.log(myObj);//{name:“Pandora”}

console.log(copyObj);//{name:“Pandora”}

我们用图片来说明事情是怎么发生的:


 

总结:

JS本身并没有说明自己是用何种参数传递方式来实作的,只能用各种示例去反推勉强得出是Call by sharing,单这终究只是推测!!

 

如果有人说JS“就是”用Call by sharing做的,只能用微笑看着他。

 

参考资料:

深入探讨JavaScript中的参数传递:call by value还是reference?

JavaScript -参数传递方式(1)

C语言:超好懂的指标,初学者请进~

[笔记]谈谈JavaScript中by reference和by value的重要观念