Array.concatで配列のクローン(コピー)を作成する

JavaScriptで配列のクローンを作成しようとして、悩んでいる方もいらっしゃるようですが、
以下のように、for ループや再帰なコードを手書きする必要はなくて、Array.concat() で配列のクローンは作成できます。

Array.prototype.clone = function(){
    return Array.apply(null,this)
}
Array.prototype.clone = function() {
    if ( this[0].constructor == Array ) {
        var ar, n;
        ar = new Array( this.length );
        for ( n = 0; n < ar.length; n++ ) {
            ar[n] = this[n].clone();
        }
        return ar;
    }
    return Array.apply( null, this );
}

デモ

http://pigs.sourceforge.jp/blog/20100116/concat.htm

    var ary1 = [1, 2, 3];
    var ary2 = ary1.concat();
    alert(uu.like(ary1, ary2)); // true
    alert(ary1 === ary2); // false;
    uu.puff(ary2); // [1, 2, 3]
    var ary1 = [ [0,1], [1,1], [2,1] ];
    var ary2 = ary1.concat();
    alert(uu.like(ary1, ary2)); // true
    alert(ary1 === ary2); // false;
    uu.puff(ary2); // [ [0,1], [1,1], [2,1] ]
    var ary1 = [ 
        [1, {"A": "a", "B": "val 1"}],
        [2, {"A": "b", "B": "val 2"}],
        [3, {"A": "c", "B": "val 3"}]
    ];
    var ary2 = ary1.concat();
    alert(uu.like(ary1, ary2)); // true
    alert(ary1 === ary2); // false;
    uu.puff(ary2); // ary1 と同じもの(JSON)
  • 補足
    • uu.like は、中身が同じなら true を返す関数です
    • uu.puff は、alert + sprintf + JSON な関数です。引数をいい感じに表示します。

Array.slice() でも配列のクローンは作れますが

Array.slice() よりも Array.concat() のほうが速く、Chrome4では倍違いますよ。
# Firefoxだと10%遅くなるケースもありますが