質問

ここに、2つの配列(npとop)を持つコードがあります。一方は他方のコピーです

ただし、コピーを変更すると、オリジナルも変更されます! 見てみましょう:

<script type="text/javascript">
var op=new Array(0, 0);
var np=op;
np[1]=2;
document.write(op+"<br>")
document.write(np)
</script>

オリジナルを保持してコピーを変更する方法はありますか?

役に立ちましたか?

解決

アレイのコピーを作成したことはありません。配列を別の変数に割り当てるだけです。これはJavascriptでコピーしません。この例では、アクセスできる2つの変数を持つ1つの配列のみがあります。 Javascriptで配列をコピーする組み込みの方法はないため、独自の関数を作成する必要があります。

実際に実装する方法のヒントについては、このStackOverflowの質問をご覧ください配列内の要素のコピー。

他のヒント

組み込みの配列関数の一部は、実際にコピーを作成します。その1つがスライスです。

例:

var op=new Array(0, 0);
var np= op.slice(0);
np[1]=2;
document.write(op+"<br>")
document.write(np)

リファレンス http://my.opera.com/GreyWyvern/blog/ show.dml / 1725165

あなたがしているのは、配列のコピーを作成することではなく、配列への参照のコピーを作成するだけなので、同じ配列オブジェクトへの2つの参照を取得します。

これは、配列の実際のコピーを作成する方法です。

var np = op.concat();

concat メソッドは、追加項目が追加された配列のコピーである新しい配列を作成します。追加の項目を指定しない場合は、配列のコピーを取得するだけです。

Array.prototype.copy = function() {
    return this.slice(0, this.length);
  }

その後


var op=new Array(0, 0);
var np=op.copy();
np[1]=2;
document.write(op+"<br>")
document.write(np)

2番目の配列をコピーするのではなく、複製する必要があります。

---更新

オブジェクトを変数に割り当てると、参照のみがコピーされます(つまり、両方が同じデータを指します)。このオブジェクトの独立したコピーを作成するには、複製する必要があります。これを行う方法はいくつかあります。たとえば、こちらは、jQueryを使用してオブジェクトを複製する方法です。

配列のコピーを返すネイティブの slice メソッドを使用できます。

var np = op.slice(0,op.length);

2番目のパラメーターはオプションである必要がありますが、IEでは必須であると考えています。

変更を加えたコード:

var op=new Array(0, 0);
var np=op.slice(0,op.length);
np[1]=2;
document.write(op+"<br>")
document.write(np)

新しい配列を作成するには、次のことを検討してください。

   var op = [];

配列をコピーするには:

var np=op.slice();

または

var np=op.concat();

concatは高速ですが、sliceは1文字少なくなります。一部の人々は「スライス」をエイリアスします;または&quot; concat&quot; 「コピー」としてコピーを作成していることがより明確になります。

どちらの場合もパラメーターは不要です。スライスのパラメーターは、コードを大きく、遅くするだけです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top