學習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的重要觀念

相關文章
相關標籤/搜索