_.clone 在 lodash 中不起作用?
_.clone in lodash not working?
我有
config.default_req = { foo: 'foo' }
this.default_req = _.clone(config.default_req);
this.default_req.body.data = 'bar';
现在 config.default_req.data
等于 'bar',为什么?我认为用 lodash 克隆应该只是复制对象,丢失任何 link 到原始对象!
知道如何真正 clone/copy node.js 中的对象吗? (v.0.10.40)
编辑:
对于那些会遇到这个问题的人,一个简单的 clone/copy 函数:
var clone = function(source){
return JSON.parse(JSON.stringify(source));
};
这是因为clone
是浅拷贝。你应该使用 cloneDeep
.
在此处查看参考资料:https://lodash.com/docs#cloneDeep
浅拷贝只会复制对象每个 属性 上的数据。所以数组和对象是通过引用传递的。浅拷贝相对较快。另一方面,深拷贝递归地沿着树向下移动,所以对象和数组是新的实例。深拷贝相对较慢,因此除非需要,否则请避免使用它们。
您可以在 fiddle 中查看:https://jsfiddle.net/qqnved24/2/
尝试使用以下方法:
var myObj = {
arr: [1, 2, 3],
obj: {
first: 'foo'
}
}
var myDeepClone = _.cloneDeep(myObj)
var myShallowClone = _.clone(myObj)
//Should ONLY change array slot 1 on my Clone
myDeepClone.arr[1] = 99
console.log(' ==== Checking Deep Clone Array ==== ')
console.log(myObj)
console.log(' -- Deep Clone Below --');
console.log(myDeepClone)
console.log('\n\n')
// Danger: Will change the 'first' property on both the shallow copy and the original
myShallowClone.obj.first = 'bar';
console.log(' ==== Checking Shallow Clone Obj ==== ')
console.log(myObj)
console.log(' -- Shallow Clone Below --');
console.log(myShallowClone);
console.log('\n\n')
// Should only change the 'first property' on the Deep Cloned Obj
myDeepClone.obj.first= 'myObj';
console.log(' ==== Checking Deep Clone Obj ==== ')
console.log(myObj)
console.log(' -- Deep Clone Below --');
console.log(myDeepClone)
console.log('\n\n')
// Danger will alter Shallow clones OBJ
myObj.obj.meaningOfLife = 42;
console.log(' ==== Mutating Original Obj ==== ')
console.log(myObj)
console.log(' -- Shallow Clone Below --');
console.log(myShallowClone)
console.log(' -- Deep Clone Below --');
console.log(myDeepClone)
我有
config.default_req = { foo: 'foo' }
this.default_req = _.clone(config.default_req);
this.default_req.body.data = 'bar';
现在 config.default_req.data
等于 'bar',为什么?我认为用 lodash 克隆应该只是复制对象,丢失任何 link 到原始对象!
知道如何真正 clone/copy node.js 中的对象吗? (v.0.10.40)
编辑: 对于那些会遇到这个问题的人,一个简单的 clone/copy 函数:
var clone = function(source){
return JSON.parse(JSON.stringify(source));
};
这是因为clone
是浅拷贝。你应该使用 cloneDeep
.
在此处查看参考资料:https://lodash.com/docs#cloneDeep
浅拷贝只会复制对象每个 属性 上的数据。所以数组和对象是通过引用传递的。浅拷贝相对较快。另一方面,深拷贝递归地沿着树向下移动,所以对象和数组是新的实例。深拷贝相对较慢,因此除非需要,否则请避免使用它们。
您可以在 fiddle 中查看:https://jsfiddle.net/qqnved24/2/
尝试使用以下方法:
var myObj = {
arr: [1, 2, 3],
obj: {
first: 'foo'
}
}
var myDeepClone = _.cloneDeep(myObj)
var myShallowClone = _.clone(myObj)
//Should ONLY change array slot 1 on my Clone
myDeepClone.arr[1] = 99
console.log(' ==== Checking Deep Clone Array ==== ')
console.log(myObj)
console.log(' -- Deep Clone Below --');
console.log(myDeepClone)
console.log('\n\n')
// Danger: Will change the 'first' property on both the shallow copy and the original
myShallowClone.obj.first = 'bar';
console.log(' ==== Checking Shallow Clone Obj ==== ')
console.log(myObj)
console.log(' -- Shallow Clone Below --');
console.log(myShallowClone);
console.log('\n\n')
// Should only change the 'first property' on the Deep Cloned Obj
myDeepClone.obj.first= 'myObj';
console.log(' ==== Checking Deep Clone Obj ==== ')
console.log(myObj)
console.log(' -- Deep Clone Below --');
console.log(myDeepClone)
console.log('\n\n')
// Danger will alter Shallow clones OBJ
myObj.obj.meaningOfLife = 42;
console.log(' ==== Mutating Original Obj ==== ')
console.log(myObj)
console.log(' -- Shallow Clone Below --');
console.log(myShallowClone)
console.log(' -- Deep Clone Below --');
console.log(myDeepClone)