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

Posted lannyQ_Q

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学习JS的心路历程-参数的传递(下)相关的知识,希望对你有一定的参考价值。

今天我们要来探讨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的重要观念

以上是关于学习JS的心路历程-参数的传递(下)的主要内容,如果未能解决你的问题,请参考以下文章

学习JS的心路历程-范围Scope和提升(Hoisting)

node js 各类数据库常用方法封装的心路历程

VS2012+EF6+Mysql配置心路历程

学JS的心路历程 -非同步执行

学JS的心路历程 - JS的Class

React+Immutable.js的心路历程