JavaScript中有一個非常重要的知識點,那就是引用傳遞。顧名思義,就是利用引用來傳遞變量的值。在函數調用時,函數的形參將會使用與實參相同的內存地址,所以,當形參的值發生改變的時候,實參的值也會同步被改變。本文將詳細介紹JavaScript中引用傳遞的相關知識。
一、基本概念
引用是一個指向對象存儲地址的值。它是一種特殊的數據類型,包括函數、數組、對象、以及其他的一些數據類型。變量保存的是該對象之所在的內存地址,而不是實際的值。
例如:我們定義一個原始數據類型的變量a,一個引用類型的變量b。
var a = 1;
var b = {name: 'peter', age: 30};
變量a保存了一個數字1,而變量b保存了一個地址,在內存中,這個地址指向一個具有name和age屬性的實際對象。
二、傳遞方式
JavaScript中通過引用的方式來傳遞參數。當函數需處理對象的數據時,他要先取得該對象的引用,再通過該訪問對象的屬性或從對象中返回值。
傳遞變量時,傳遞的值是變量所在對象的地址,而不是變量的值本身。如下面例子:
var obj = {a: 1}; function fn(x){ x.a = 2; } fn(obj);//調用函數 console.log(obj.a);//輸出2在調用函數fn時,參數obj的值其實是obj所在的地址,當在函數內部修改了obj.a的值為2時,obj的值也隨之被改變了,在最后輸出obj.a時,結果為2。 三、對象傳遞 JavaScript中的對象傳遞是指,把引用類型的數據作為函數的參數來傳遞的過程。在函數內部,我們可以修改傳遞進來的對象的屬性,同時,原始對象的值也會隨之被修改。
var obj = {name: "peter"}; function fn(x){ x.name = "mary"; } fn(obj); console.log(obj.name);//輸出mary在函數fn中,參數x保存了對象obj的一個引用,而不是一個新的對象。當修改x.name的值時,直接影響到了原對象obj的name屬性的值,這樣的結果就是執行完函數fn之后,原來的name屬性值被修改為了“mary”。 四、數組傳遞 引用傳遞同樣適用于數組類型。我們可以將數組傳遞給函數,并在函數內部對數組進行操作,這樣的改變會表現在原始數組中。
var arr = [1, 2, 3]; function fn(x){ x.push(4); } fn(arr); console.log(arr);//輸出[1, 2, 3, 4]在函數fn中,我們將arr數組傳遞進去,函數內部通過push方法向數組中增加數字4,這樣的操作改變了原數組arr的值。所以,在輸出arr數組時,他變成了[1, 2, 3, 4]。 五、需要注意的問題 當我們對引用值進行改變的時候,一定要非常小心。因為,任何對引用值的改變都會產生副作用。也就是說,我們可能在某個地方修改了該值,卻不知道它會對其他位置造成怎樣的影響。 以下示例便是一個常見的問題:
function foo(x){ x.push(4); x = [5, 6, 7]; x.push(8); } var arr = [1, 2, 3]; foo(arr); console.log(arr);//輸出[1, 2, 3, 4]在函數foo中,我們通過push方法向數組arr中添加了數字4,在x = [5, 6, 7]這一行,我們創建了一個新數組,并把x指向了這個新數組以替換原數組。之后,我們又通過push方法向數組中添加數字8。但是,在我們輸出原數組arr時,結果仍為[1, 2, 3, 4],這是因為,當我們聲明了一個新的數組x時,它只是改變了x所指向的內存地址,而不是arr的地址,故結果不會發生變化。 六、總結 引用傳遞是JavaScript中的一個重要概念,他給我們在開發應用程序時提供了很強的靈活性和擴展性。但是,在操作引用值時,我們必須特別小心,以免不經意間對有意的對象代碼造成損失。