深刻學習js系列是本身階段性成長的見證,但願經過文章的形式更加嚴謹、客觀地梳理js的相關知識,也但願可以幫助更多的前端開發的朋友解決問題,期待咱們的共同進步。前端
若是以爲本系列不錯,歡迎點贊、評論、轉發,您的支持就是我堅持的最大動力。git
在《JavaScript 高級程序設計》第三版 4.1.3 講到傳遞參數:github
ECMAScript 中全部函數的參數都是按照值進行傳遞的。數組
什麼是按照值傳遞?微信
也就是說,把函數外部的值複製給函數內部的參數,就和把值從一個變量複製到另外一個變量同樣。數據結構
舉一個簡單的例子:閉包
var value = 1;
function foo(v) {
v = 2;
console.log(v); // 2
}
foo(value);
console.log(value); // 1
複製代碼
很好理解,當傳遞 value 到函數 foo 中,至關於拷貝了一份 value,假設拷貝的這份叫作 _value
,函數中修改的 都是_value
的值,而不會影響到原來的 value 值。app
上述代碼中 在執行 foo 函數的時候傳遞的是 全局的變量 value 當這個 value 被當作實參傳遞時候,在內部從新賦值變成了 2 所以在函數內部打印的就是 2,接下來 在函數執行完畢以後 再次打印全局變量 value 的值仍是 1,說明在函數內部修改的 value 值並無對全局的 value 形成影響。函數
拷貝雖然很好理解,可是當值是一個複雜的數據結構的時候,拷貝就會產生性能上的問題。因此還有另一種傳遞數據的方式叫作引用傳遞。post
所謂按照引用傳遞,就是傳遞對象的引用,函數內部對參數的任何改變都會影響該對象的值,由於二者引用的 是用一個對象。
舉個例子:
var obj = {
value: 1
};
function foo(o) {
o.value = 2;
console.log(o.value); // 2
}
foo(obj);
console.log(obj.value); // 2
複製代碼
嗯哼,咱們的紅包書中明明已經說了啊,js 中的全部函數的參數都是按照值進行傳遞的,這怎麼能按照"引用傳遞"成功 了呢?
那這到底是不是按照引用傳遞呢?
不着急,讓咱們在看個例子:
var obj = {
value: 1
};
function foo(o){
o = 2;
console.log(o); // 2
}
foo(obj);
console.log(obj.value);// 1
複製代碼
若是js 是按照引用傳遞在上述代碼中 外層的值也會被修改啊,這怎麼在最後打印的時候又沒有進行修改呢?
因此這裏要講的還有第三種傳遞方式——共享傳遞。
而共享傳遞是指,在傳遞對象的時候,傳遞對象引用的副本。
因此修改了o.value 能夠經過引用找到原值,可是直接修改 o 並不會修改原值,因此第二個和第三個 例子其實都是共享傳遞。
最後,你能夠這樣理解:
參數若是是基本類型是按照值傳遞,若是是引用類型按共享傳遞。 可是由於拷貝副本也是一種值的拷貝,因此在高程中也是直接認爲是按照值傳遞了。
##參考:
歡迎添加個人我的微信討論技術和個體成長。