深刻學習js之——參數按值傳遞#9

深刻學習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 並不會修改原值,因此第二個和第三個 例子其實都是共享傳遞。

最後,你能夠這樣理解:

參數若是是基本類型是按照值傳遞,若是是引用類型按共享傳遞。 可是由於拷貝副本也是一種值的拷貝,因此在高程中也是直接認爲是按照值傳遞了。

##參考:

《JavaScript深刻之參數按值傳遞》

深刻學習JavaScript系列目錄

歡迎添加個人我的微信討論技術和個體成長。

歡迎關注個人我的微信公衆號——指尖的宇宙,更多優質思考乾貨

相關文章
相關標籤/搜索