2

コードに奇妙なバグがあり、なぜそれが発生するのか理解できません。

配列array1があります。array2をarray1と等しくすることで、array1を複製します。次に、スプ​​ライスを使用してarray2を変更し、数値を追加します。Array1に触れてはいけませんか?しかし、どちらも同じ変化を出力します。

var array1 = [0,1,2,3,4,5];
var array2 = array1;
array2.splice(1,0,1) //add  
console.log(array1);
console.log(array2);

配列の割り当てを混乱させていると思いますか?これを起こさずにアレイを複製する適切な方法は何ですか?

乾杯

4

3 に答える 3

4

array1.concat()への参照を渡す代わりに、配列を複製するために使用しarray1ます。

var array1 = [0,1,2,3,4,5];
var array2 = array1.concat();
array2.splice(1,0,1) //add  
console.log(array1);
console.log(array2);

array.concat()複数の配列を連結できますが、空の引数を渡すと、事実上何もない配列を連結することになります: 配列のクローンを作成します。

配列要素とオブジェクト要素は引き続き参照であることに注意してください。

var a = [ [1], 2];
var b = a.concat();
b[0][0] = 0;
console.log(b); // gives 0,2
console.log(c); // gives 0,2 too!
于 2011-08-18T17:20:52.533 に答える
0

jQuery を使用している場合は、次のことができます。

var array1 = [0,1,2,3,4,5];
var array2 = array1.slice();
array2.splice(1,0,1) //add  
console.log(array1);
console.log(array2);

この例をチェックしてください。

于 2011-08-18T17:22:57.173 に答える
-1

配列とオブジェクトは参照によってコピーされます。これを試して:

Object.prototype.clone = function() {
  var newObj = (this instanceof Array) ? [] : {};
  for (i in this) {
    if (i == 'clone') continue;
    if (this[i] && typeof this[i] == "object") {
      newObj[i] = this[i].clone();
    } else newObj[i] = this[i]
  } return newObj;
}

var array1 = [0,1,2,3,4,5];
var array2 = array1.clone();
于 2011-08-18T17:20:51.953 に答える