Lodash .clone和.cloneDeep行为

时间:2014-02-18 11:11:11

标签: javascript jquery backbone.js underscore.js lodash

我尝试使用嵌套对象克隆一个对象数组。

类似的东西:

var data = [
    { id: 1, values: { a: 'a', b: 'b' } },
    { id: 2, values: { c: 'c', d: 'd' } }
];

_。克隆

使用_.clone方法和isDeep上的true参数:

var clone = _.clone(data, true);

data[1].values.d = 'x';

console.log( _.isEqual(data, clone) ); // true, clone[1].values.d == 'x'

我期待clone[1].values.d == 'd'

  

如果isDeep为true,嵌套对象也将被克隆,否则它们将被克隆   将通过引用分配。

有什么问题?

_。CloneDeep

此外,当我尝试使用_.cloneDeep方法时,我收到错误:

var clone = _.cloneDeep(data);

// Uncaught TypeError: Object function u(n){return n instanceof u?n:new o(n)}
// has no method 'cloneDeep'

为什么会出现此错误?

$。延伸

使用$.extend克隆没有按预期引用原始对象:

var clone = $.extend(true, {}, data);

console.log( _.isEqual(data, clone) ); // false, clone[1].values.d == 'd' 

1 个答案:

答案 0 :(得分:21)

感谢Gruff Bunny和Louis的评论,我找到了问题的根源。

当我使用Backbone.js时,我加载了一个与Backbone和Underscore兼容的Lodash特殊版本,可以禁用某些功能。在这个例子中:

var clone = _.clone(data, true);

data[1].values.d = 'x';

我刚用Backbone应用程序中的Normal版本替换了Underscore版本,应用程序仍在运行。所以我现在可以使用具有预期行为的Lodash .clone。

编辑2018: Underscore版本doesn't seem to exist anymore。如果您在2018年阅读此内容,可能会对this documentation(Backbone和Lodash)感兴趣。