0

非プリミティブ データ型としての配列は、値ではなく JavaScript の参照によって処理されることを認識していますが、その配列の特定の要素はプリミティブ データ型である可能性があり、参照によって割り当てられていないと仮定します。 .

配列内の個々の要素への参照を取得する方法を知りたいので、その要素を変更している間、配列とインデックス番号を参照し続ける必要はありませんか?

すなわち

var myElement=someArray[4]
myElement=5
//now someArray[4]=5

これが意図された動作ではないことを暗示しているが明示的に述べていないさまざまなドキュメントを誤解していますか?

4

2 に答える 2

2

配列要素のコピーを作成することはできますが、配列プロパティ参照のエイリアスとして機能する値を作成することはできません。これはオブジェクト プロパティにも当てはまります。もちろん、配列要素の参照オブジェクト プロパティの参照です。

最も近い方法は、コードを使用して配列を更新するセッターを使用してオブジェクトを作成することです。それは次のようになります。

 var someArray = [ ... whatever ... ];

 var obj = {
   set element5(value) {
     someArray[5] = value;
   }
 };

それで:

 obj.element5 = 20;

更新しsomeArray[5]ます。これは明らかに より改善されたものではありませんsomeArray[5] = 20

編集— ここで、配列要素がオブジェクトの場合、要素のコピーを作成することは、オブジェクトへの参照のコピーを作成することを意味することに注意してください。したがって:

var someArray = [ { foo: "hello world" } ];

var ref = someArray[0];

それで:

ref.foo = "Goodbye, cruel world!";

によって参照されるオブジェクトの「foo」プロパティを更新しますsomeArray[0]

于 2013-11-07T00:49:08.520 に答える
1

これを更新するために、いつでもクロージャーを渡すことができます。

var myUpdater = function(x) {
  someArray[4] = x;
}
myUpdater(5);

読み取り/書き込み機能が必要な場合は、ボックスに入れます。

var makeBox = function(arr, n) {
  return {
    read: function() { return arr[n]; },
    write: function(x) { arr[n] = x; }
  };
} 

// and then:
var ptr = makeBox(someArray, 4);
ptr.read(); // original
ptr.write(newValue);
someArray[4]; // newValue
于 2013-11-07T00:52:29.580 に答える