「母より」使ってみたかっただけです。
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にするためには
- lodashに乗り換えて_.cloneDeepを使う
- ゴリゴリ実装する(underscore.deepclone.jsから拝借)
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する
- ※当たり前ですがJSON.stringifyできないObjectの場合は使えないので、本番のプロダクトなどに使用するのは危険すぎ。
一応Underscore.jsのレポジトリで議論されてる
→https://github.com/jashkenas/underscore/issues/162
まあでもUnderscore.jsのメンテはあまりされていないので、おとなしくlodash使った方がよさそうですね。