为什么是我的简单,纯JavaScript,浅克隆函数不工作,因为我的期望
Why is my simple, pure JavaScript, shallow clone function not working as I expect?
我需要一个JavaScript文字对象的克隆函数,它现在甚至不需要递归地克隆。该函数必须是纯JavaScript,不能使用库。我做了一些研究,作为这个问题的一些最简单的答案表明,在这种情况下,我所需要的是"for in"循环与hasOwnProperty检查。问题是,所谓的复制对象的行为就好像我在新对象中复制了对原始属性的引用一样。这不是我的目标。克隆函数的方式是源对象的任何更改都不会影响目标对象,反之亦然。下面是代码:
...
function clone(from,to){
for (var key in from){
if(from.hasOwnProperty(key)){
to[key]=from[key];
}
}
return to;
}
...
var newComponent = clone(component,{});
var defaultComponentDrawParams = clone(component.drawParams,{});
if(params.type==="button"){
console.info('new component');
component.drawParams.subType="chinga chunga";
console.info(defaultComponentDrawParams.subType);
console.info(newComponent.drawParams.subType);
}
控制台显示:
new component
saveFile
chinga chunga
如果我正确理解了"新组件"之后的两个输出应该是"未定义",因为我的目标是在更改组件时。不改变newComponent.drawParams。请告诉我我错过了什么
我猜你有多个component
,其中一个是"saveFile" component
。问题是,克隆并不是克隆对象/数组,而只是创建对它们的引用。所以当你更新一个component
时,所有对这些相同对象有引用的component
也会被更新。
下面是您可能需要添加的检测类型的示例。然而,这可能不是一个绝对完整的答案,可以捕获所有的情况。
function clone(from,to){
for (var key in from){
if(from.hasOwnProperty(key)){
var val = from[key];
if(typeof val === 'object') {
to[key] = clone(from[key], {});
} else {
to[key] = from[key];
}
}
}
return to;
}
我犹豫是否建议这样做,但另一种选择是使用javascript库,如Underscore.js: http://underscorejs.org/
它非常轻量级(5kb,几乎没有jQuery那么大),并且为您提供了许多这类事情。
相关文章:
- 我的shareService在angular 2中发送值工作正常,但当我渲染我的另一个组件时,会获得默认值
- 我的django模板布尔变量是't在javascript中按预期工作
- 为什么不是'我的JS滑块正在工作
- 为什么不是'我的函数在解析云代码中工作吗?当我在Angular和Express中测试时,它是有效的
- 为什么jquery悬停在jsfiddle中可以工作,而在我的html布局中却不能
- 为什么这个jQuery可以作为一个小提琴工作,但在我的网页上没有
- 为什么我的JavaScript在Safari上的严格模式下不能正常工作
- 由于某种原因,我的JavaScript函数无法工作
- 为什么获胜'我的自定义功能工作
- 我需要一个jQuery函数来只工作在700px以上的屏幕大小,无法在我的代码中发现错误
- 我的动画没有按预期工作
- 为什么不是't我的“;虚拟的“;阵列工作
- 为什么动态加载的事件在我的代码中不能正常工作
- 什么能抵消我的工作压力
- jQuery.append'我不能胜任我的工作
- 任何人都可以指出我的工作代码或完整的概念图,用于 Angular2 中的 ViewMetadata
- ' Array.from({length: 5}, (v, i) =>我)的工作
- React WebPack -发送我的工作到在线服务器
- 纯Ajax发送其他变量与我的工作文件上传
- 在我的工作场所使用WebDriver无法打开Firefox,无法在PATH中找到Firefox二进制文件