deep clone

http://javascript.about.com/od/objectorientedjavascript/a/oop17.htmを参考にちょっと書いてみた。

function clone(obj) {
  var clonedObject = {},
      keys = Object.keys(obj),
      i = keys.length,
      value;

  for (; i--;) {
    value = obj[keys[i]];
    if (value !== null && typeof value === 'object') {
      clonedObject[keys[i]] = (value.constructor === Array) ?
          value.concat() :
          clone(value);
    } else {
      clonedObject[keys[i]] = value;
    }
  }

  return clonedObject;
}

RegExpとかDateもコピー出来るといいのかなーと思ったけど面倒でやめた……
書いておいてなんだけど使わないだろうなー。


追記:
id:ishiducaさんがRegExpのコピーについて書いてくださいました。
https://gist.github.com/4050905
人のコードは参考になるなー。なるほどー。


追記2:
Array.concatしても、中にオブジェクト持ってたらちゃんとコピーできないじゃん!


追記3:
モジュール書いた!deepcopyを書いたよ - 四角革命前夜