今天咱們要來探討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的重要觀念