Edited at

Underscore.jsの_.cloneはDeepではないので気を付けるように 母より

「母より」使ってみたかっただけです。

Underscore.jsの_.cloneを使っていたら、ファ?!?となりましたので共有します。

var params = {

key : {
val: 'aaa'
,org: 'bbb'
}
};
var clonedParams = _.clone(params); //shallow copy

clonedParams.catg = 'AAA';
clonedParams.key.val = 'ccc';

console.log(clonedParams);
// -> {"key":{"val":"ccc","org":"bbb"},"catg":"AAA"}
console.log(params);
// -> {"key":{"val":"ccc","org":"bbb"}}

clonedParams.key.valを書き換えたらparams.key.valも書き換わっちゃうんですね。

Deep copyしたくて_.clone使ってるのに、意味ない。

(2階層以下は参照にしたい、っていう需要なんてあるんだろうか…?)

Deepにするためには

var deepClone = function(object) {

var clone = _.clone(object);

_.each(clone, function(value, key) {
if (_.isObject(value)) {
clone[key] = deepClone(value);
}
});

return clone;
};


  • Json.stringifyしてからJSON.parseする:innocent:


    • ※当たり前ですがJSON.stringifyできないObjectの場合は使えないので、本番のプロダクトなどに使用するのは危険すぎ。



一応Underscore.jsのレポジトリで議論されてる

https://github.com/jashkenas/underscore/issues/162

まあでもUnderscore.jsのメンテはあまりされていないので、おとなしくlodash使った方がよさそうですね。