1

Javascript関数で定義されたローカル配列を引数として別の関数に渡すと、配列が空でない限り、上流の配列が変更されます。たとえばfoo別の関数に言うbar

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 => []

しかし、配列プッシュを使用する場合、なぜ、空の配列をどのように更新するのfooでしょうか?

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

2 に答える 2

2

内部barでは、変数に新しい値x = [1]を割り当てるだけです。変数は関数に対してローカルであり、これは引数を渡すために使用した変数には影響しません (変数を使用して値を渡すのではなく、 のようなリテラルを使用したと想像してください)。xbar([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]

foo最初に同じ配列をbar参照するため、どちらの変数でも配列を変更できます。後で、新しい値を に割り当てますbar。これは の値に影響を与えずfoo、配列を引き続き参照します。

値を関数に渡すかどうかは関係ありません。


すでに指摘したように、空の配列と空でない配列の間に違いはありません。最初の例で得られると主張する結果は正しくありません。出力は になります[9]

于 2013-04-30T19:23:54.060 に答える
1

2 番目と 3 番目の例の両方で、xはメモリ内の Array オブジェクトへの参照を含む変数です。

2 番目の例でbarは、変数xを新しい Array オブジェクト、つまりに再割り当てします[1]。これは、元のメモリ内の Array オブジェクトには影響しません。変数を再割り当てしただけです。

3 番目の例では、次のように呼び出しますx.push。これは、変数 "x" によって参照される Array オブジェクトの push メソッドを呼び出し、その配列を変更します。

ここでの重要な概念は次のとおりです。

  1. 変数とそれが参照するオブジェクトの違い。再割り当てすると、同じ変数が新しいオブジェクトを指します。
  2. JavaScript では、関数を呼び出してオブジェクトを渡すと、そのオブジェクトへの参照が渡され、それに対する操作は元のオブジェクトに影響します。

Felix が指摘したように、最初の例は 2 番目と同じように動作します。

于 2013-04-30T19:34:58.383 に答える