Lodash .clone和.cloneDeep行为

GG.*_*GG. 37 javascript jquery backbone.js underscore.js lodash

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

就像是:

var data = [
    { id: 1, values: { a: 'a', b: 'b' } },
    { id: 2, values: { c: 'c', d: 'd' } }
];
Run Code Online (Sandbox Code Playgroud)

_.克隆

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

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

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

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

我期望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'
Run Code Online (Sandbox Code Playgroud)

为什么这个错误?

$ .extend

随着$.extend克隆没有参照原对象的要求:

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

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

GG.*_*GG. 24

感谢Gruff Bunny和路易斯的评论,我找到了问题的根源.

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

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

data[1].values.d = 'x';
Run Code Online (Sandbox Code Playgroud)

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

编辑2018: Underscore构建似乎不再存在.如果您在2018年阅读本文,您可能会对此文档感兴趣(Backbone和Lodash).