2013-04-30 58 views
1

Javascript當我們通過在函數定義到不同的函數作爲參數,將修改上游陣列一個局部陣列除非數組爲空 例如說foo到一個不同的功能說bar數組如何在被調用函數中更新調用函數中的數組,並將其傳遞給javascript中的函數?

var foo = function() { 
    var x = [9]; //Array is not empty 
    bar(x); 
    console.log("x =>",x); 
}; 
var bar = function(x) {x[0] = 1;}; 
foo(); // x => [1] 

x => [1]的輸出,並且如果數組爲空,並在調用函數bar改性它不會在調用方函數更新所述陣列foo

var foo = function(){ 
    var x = []; //Array is empty 
    bar(x); 
    console.log("x =>",x); }; 
var bar = function(x) {x = [1];}; 
foo(); // x => [] 

但是萬一如果我們使用數組push的原因,它如何更新foo中的空數組?

var foo = function(){ var x = []; bar(x); console.log("x =>",x); }; 
var bar = function(x) {x.push(3);}; 
foo(); // x => [3] 
+0

因爲你在數組引用上調用'push'。在第一個例子中,你設置了'x',但它是一個不同的'''因爲它在一個函數內。 – 2013-04-30 19:23:45

+2

沒有關於空數組行爲不同的特殊規則,並且您的第一個示例應該顯示'[9]'。 (以防萬一,在FF20中驗證它)。如果你試圖將你的實際問題簡化成最小的代碼段,那麼你必須忽略一些重要的東西。 – Xion 2013-04-30 19:26:42

回答

2

內部barx = [1]簡單地分配一個新到可變x。該變量對函數來說是局部的,這對您用來傳遞參數的變量沒有影響(假設您沒有使用變量來傳遞該值,而是一個字面值,如bar([1,2]);)。

x.push(3)另一方面確實不是分配一個新的值。它就地修改陣列。這是可行的,因爲數組是可變的。

類似地,x[0] = 1;通過向陣列的第一個位置分配一個新值來改變陣列in-place

非常簡單的例子:

var foo = [1]; 
var bar = foo; 

bar.push(2); 
console.log(foo); // shows [1, 2] 

bar = 42; 
console.log(foo); // still shows [1, 2] 

foobar參考在開始同一陣列,因此可以修改與任一變量的數組。稍後我們爲bar分配一個新值。這對foo的值沒有影響,它仍然引用該數組。

無論您是否將值傳遞給函數都沒有什麼區別。


正如已經指出的那樣,空數組和非空數組之間沒有區別。你聲稱爲第一個例子得到的結果是不正確的。輸出將是[9]

+1

簡而言之,你有一個對'bar'數組的引用,使得引用等於完全不同的東西不會影響'foo'的原始引用。跨語言的非常一致的行爲。 – 2013-04-30 19:33:17

+0

@FeistyMango第一個示例中的結果是正確的,我在Chrome中進行了測試。 – Akinza 2013-04-30 19:42:14

+0

@Akinza哦,我知道這是正確的= P因此,upvote哈哈。我只是簡單回答他的回答。 – 2013-04-30 19:45:34

1

在第二個和第三個示例中,x是一個變量,它包含對內存數組對象的引用。

在第二個示例中,bar將變量x重新分配給新的Array對象,即[1]。這對原始的內存數組對象沒有影響。你所做的所有事情都被重新分配了一個變量。

在第三個示例中,您可以調用x.push:這將調用由變量「x」引用的Array對象的push方法,從而更改該數組。

這裏的關鍵概念是:

  1. 一個變量並將其指的是對象之間的差異。如果您重新分配它,同一個變量將指向一個新的對象。
  2. 在JavaScript中,當你調用一個函數並傳入一個對象時,你傳遞了該對象的引用,並且你對它做的任何操作都會影響原始對象。

正如Felix指出的,第一個例子與第二個例子的行爲相同。

相關問題