1

注:arr.slice(0)これは、この「問題」を修正する共通配列コピー「問題」の何百万もの複製の1つではありません

そうは言っても、なぜこの予期しない結果が得られるのかを理解したいと思います。

var oldArr = [[1,2],[3,4]];
var find = oldArr[1];

var newArr = oldArr.slice(0);
console.log(newArr.indexOf(find)); //1?

//proof that newArr is NOT referenced to oldArr
newArr[0] = "Hi";
newArr[1] = "How are you?";
console.log(oldArr+" "+newArr); //"1,2,3,4 Hi,How are you?"

jsFildde デモ

次の代替のいずれかに置き換えるfindと、期待される が返されます-1

  • [3,4]直接使用
  • 変数保持を使用する[3,4]
  • 保持している別の配列を参照して変数を使用する[3,4]

これらの最後の 3 つの方法と最初の例に違いがある理由についての説明が見つかりません。私の知る限り、何もないはずです。

何か案は?

4

2 に答える 2

2

の:

[[1,2],[3,4]]

3つの配列オブジェクトが作成されます。

外側のみが処理されていsliceます。これにより、「浅いコピー」が作成されます。

このことを考慮:

var a = [1,2]
var b = [3,4]
var c = [a,b]
var d = c.slice(0)
d[0] === a       // true, which means it is the /same/ object
d[0][0] = "Hi!"
a                // ["Hi!", 2]

ハッピーコーディング!

于 2012-05-05T02:45:54.197 に答える
1

すべてが期待どおりに機能しています

indexOf値ではなく参照で検索するため、2 つのオブジェクトが===互いに異なる場合、indexOfそれらは見つかりません。

あなたの場合:

var oldArr = [[1,2],[3,4]];
var find = oldArr[1];

var newArr = oldArr.slice(0);

find配列 [3,4] を指します。したがって、newArray には 2 つのオブジェクト (2 つの配列) が含まれます。実際に何が起こっているかを知りたい場合は、find.push(5) を実行してみてください。

于 2012-05-05T02:56:47.893 に答える