3

いくつかの関連する配列を使用しているときに、ある種の疎外効果を見つけました。エラーを探して頭を悩ませた後、ついに解決策を見つけました。しかし、なぜこれが起こっているのか説明してくれる人がいるかどうか知りたいです。

私のコードは次のようなものでした:

var closed =['closed', 'closed', ..., 'closed'];
sunday = closed;
...
saturday = closed;

この後、私がそうするなら:

sunday[2] = 'open';

私はsunday[2]='open'、monday [2] ='open'、tuesday [2] ='open'、...、saturday [2]='open'を取得します。変更するマテリアルがないため、すべての変数が「接着」またはリンクされているようです。すべての変数が同じように変更されます。

私はそれをこのように修正しました:

var closed1 =['closed', 'closed', ..., 'closed'];
...
var closed7 =['closed', 'closed', ..., 'closed'];
sunday = closed1;
...
saturday = closed7;

そして今、私は独立変数を取得します。しかし、私はこの解決策が好きではないので、誰かが問題を知っていればありがたいです。GoogleChromeでJavaScriptを実行しています。

ありがとう

4

3 に答える 3

8

配列はオブジェクトであり、オブジェクトは参照型です。

各変数sunday, monday, tuesday, etc...は同じ配列への参照を保持するため、各変数はその配列への変更を観察できます。


あなたのコードを見ると、配列の代わりにオブジェクトを使用する必要があるかもしれないという直感があります。

var closed = {
    sunday:    'closed',
    monday:    'open',
    tuesday:   'open',
    wednesday: 'open',
    thursday:  'open',
    friday:    'open',
    saturday:  'closed'
};

ただの勘です。私はそれをそこに捨てると思った。

于 2012-10-30T15:32:39.073 に答える
4

closed問題は、JavaScript では、オブジェクト型 (例のような配列を含む) が実際のオブジェクトへの参照であることです (関連する質問)。これxは、 が変数であり、その値がオブジェクト型である場合y = x、 のコピーを に配置しないことを意味xyます。これは単に、両方の名前を使用して同じオブジェクトを参照できることを意味します。

ここで実際に必要なのは、のコピーを作成することですclosed(「クローン」)。配列なので、簡単に行うことができます

sunday = closed.slice(0); // etc
于 2012-10-30T15:33:38.187 に答える
1

元の配列への参照ではなくコピーを取得するには、次を使用しますslice

var closed = ['closed', 'closed', ... ];
var sunday = closed.slice();
var monday = closed.slice();
于 2012-10-30T15:43:17.433 に答える