2014-10-07 86 views
0

我有如下測試用例:通行證通過javascript參考和值/ jquery的

$(document).ready(function() { 
    var arrayList=[{"name":"pradip"},{"name":"Tengi"}]; 
    var del = function(list) { 
     list.splice(1,1); 
     $("div").append("function:" + list.length +"<br>"); 
    }; 
    $("div").append("original:" + arrayList.length+"<br>"); 
    del(arrayList); 
    $("div").append("modified"+ arrayList.length+"<br>"); 

    var test=1; 
    var increase=function(a){ 
     a++; 
     $("div").append("function="+a+"<br>"); 
    } 
    $("div").append("original test="+test+"<br>"); 
    increase(test); 
    $("div").append("increased test="+test+"<br>"); 
}); 

的輸出是:

original:2 
function:1 
modified1 
original test=1 
function=2 
increased test=1 

當我通過值傳遞數組的功能,並且在函數I改變了數值,改變也反映在原始數組中,但在其他情況下,沒有改變。

JSFiddle

爲什麼傳值充當如果它是通過對數組引用傳遞?

+2

JavaScript只能通過傳遞,值。在對象的情況下,該值實際上是該對象的一個​​引用*。 *通過引用*有所不同:http://en.wikipedia.org/wiki/Evaluation_strategy#Call_by_reference – 2014-10-07 15:56:57

回答

2

您正在按值傳遞對數組的引用。

您現在有兩個對同一個數組實例的引用。

如果您不希望數組發生更改,則需要顯式創建副本。

-1

如果傳遞的參數是原始類型等() 然後傳遞的參數的一個副本被創建(當函數調用結束時銷燬)其通過值裝置通道

但如果傳遞的參數對象陣列那麼就需要通過通道參考

這裏有一個例子

num = 10; 
str = 'string'; 
arr = [1,2,3] 
obj = {p1:'val1'} 

function passedBy(arg1){ 
    if(typeof arg1 === 'object'){ 
    // we are in the case where arg1 can be an object or an array 
     if(arg1.constructor === Array){ 
      // add 1 to the passed array 
      arg1.push(1); 
     }else{ 
      // add p2 property to the passed object 
      arg1.p2 = 'val2'; 

     } 

    }else{ 
     //here arg1 parameter is a string or a number 
     // if arg1 is a string the following instruction should perform a concatenation  
     // operation instead it should add 1 to arg1 
     arg1 +=1 
    } 

} 

現在你可以試試這個簡單的函數參考,並且通過按值看通道之間的差異

例如

passedBy(num); 
passedBy(str); 
console.log(num); 
console.log(str); 

我們可以很容易的看到,價值strNUM即使我們修改他們passedBy()函數

內部沒有改變,但如果我們試圖

passedBy(arr); 
passedBy(obj); 
console.log(arr); 
console.log(obj); 

,我們可以清楚地看到 是ARROBJ內容與最初的不一樣

希望你得到它

+1

不,JavaScript中沒有引用傳遞。 – newacct 2014-10-07 18:48:24

+0

嘗試將對象傳遞給函數並在函數內部嘗試修改對象(例如添加新屬性),並在嘗試顯示舊對象(作爲參數傳遞的對象)後,您將獲得一個新屬性添加到初始對象,所以你稱之爲? – Ismail 2014-10-08 21:19:08

+1

這是按價值傳遞。你不能在JavaScript中傳遞一個對象。對象不是JavaScript中的值。 JavaScript中唯一的類型是基元和引用(指向對象的指針)。您正在按值傳遞一個指針。它與Java完全一樣,它也只是通過價值傳遞。 – newacct 2014-10-09 00:17:52