学习JS的心路历程-参数的传递(下)

今天咱们要来探讨JS究竟是透过何种参数传递方式呢?3d

 

废话很少说,上示例!!blog

 

咱们先声明原始型别和物件型别来看看二者是否会有不同的差别:图片

 

var myStr = 'Hola';ip

var myObj = {name:'Ann'};console

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

 

var myStr = 'Hola';变量

var myObj = {name:'Ann'};im

 

var copyStr = myStr;call

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的重要观念

相关文章
相关标签/搜索