在JS中,有兩種不同的方式可以操作數據的值,這兩種技術分別叫做 傳值 和 傳址。
傳值:在賦值過程中,首先對值進行了一份拷貝,而后將這份拷貝存儲到一個變量、對象屬性或數組元素中。拷貝的值和原始的值是完全獨立、互不影響的。當一份數據通過值傳遞給一個函數,實際上被傳遞的不是數據本身,而是數據的一份拷貝。因此,如果函數修改了這個值,影響到的只是數據的那份拷貝,而並不影響數據本身。
傳址:在賦值過程中,變量實際上存儲的是數據的地址(對數據的引用),而不是原始數據或者是數據的拷貝。如果值通過一個地址發生了改變,這個改變也會通過原始地址表現出來。
根據操作數據方式的不同,我們可以把數據類型分為兩類:基礎類型 和 引用類型。
基礎類型主要有:數字(Number)、布爾類型(Boolean)、字符串(String);其操作方式為 傳值。
引用類型主要有:對象(Object) —— 數組(Array)、函數(Function);其操作方式為 傳址。
以數字為例:
1 var n = 1; 2 var m = n; 3 function total(x,y){ 4 x = x + y; 5 } 6 total(n,m); 7 if(n == 1){ 8 alert(1); 9 }
執行結果:輸出1
以函數為例:
1 function a(){ 2 var x = {'n':1}; 3 var y = x; 4 x.n = 2; 5 console.log(y); 6 }; 7 a();
執行結果:{'n':2}
以數組為例:
1 function b(){ 2 var x = [1,2]; 3 var y = x; 4 y[2] = 3; 5 console.log(x); 6 }; 7 b();
執行結果:[1,2,3]