2012-05-05 35 views
1

注:が、これは一般的な配列のコピー「問題」の何百万人ものDUPのの1 arr.slice(0)修正この「問題」私はこの予想外の結果を取得しています理由を理解したい、と述べた参照されていない配列 "スライス"の後に参照されない?

を使用していないです。

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 Demo

次の選択肢のいずれかとfindを交換した場合、それは期待-1を返します。

  • 使用[3,4]直接
  • [3,4]

を保持している他の配列の参照して、変数を使用し[3,4]

  • を保持する変数を使用して、私は、これらの間のいずれかの差がある理由は上の任意の説明を見つけることができません最後の3つの方法と最初の例。私が知る限り、何もないはずです。

    アイデア?で

  • 答えて

    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] 
    

    はこのことを考えてみましょう!

    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)を実行してみてください。

    +1

    「indexOf」に関するビットは+1です。私は "アイデンティティ"と "平等"が同じものである非オブジェクトプリミティブを除いて、 "アイデンティティ"という用語を使用し、それが "アイデンティティ検索"(対 "等価検索")だと言うでしょう;-) –

    関連する問題