【问题标题】:Why is my simple, pure JavaScript, shallow clone function not working as I expect?为什么我的简单、纯 JavaScript、浅层克隆函数没有按预期工作?
【发布时间】:2014-05-03 17:07:59
【问题描述】:

我需要一个用于 JavaScript 文字对象的克隆函数,它现在甚至不需要递归克隆。该函数必须是纯 JavaScript,不能使用任何库。我做了一些研究,正如一些最简化的answersthis 问题所暗示的那样,在这种情况下,我所需要的只是带有 hasOwnProperty 检查的“for in”循环。问题在于,所谓复制的对象表现得好像我已经复制了对新对象中原始属性的引用。那不是我的目标。克隆功能的方式是源对象的任何更改都不会影响目标对象,反之亦然。 代码如下:

...
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

如果我理解正确,“新组件”之后的两个输出都应该是“未定义”,因为我的目标是在更改 component.drawParams 时不更改 newComponent.drawParams。 请告诉我我错过了什么。

【问题讨论】:

    标签: javascript copy clone pass-by-value


    【解决方案1】:

    我猜你有多个components,其中一个是“saveFile”component。问题是您的克隆没有克隆对象/数组,它只是创建对它们的引用。因此,当您更新一个component 时,所有引用这些相同对象的components 也会得到更新。

    以下是您可能需要添加的检测类型的示例。但是,这可能不是涵盖所有情况的绝对完整答案。

    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 大),并且为您解决了很多此类问题。

    【讨论】:

    • 我不想使用外部库,并且就我所教的if(typeof val==='object') 而言,它只会调用函数本身,以防对象属性之一是对象本身。换句话说,我看不到复制属性的方式有任何变化,但我会尝试一下。
    猜你喜欢
    • 1970-01-01
    • 2012-09-09
    • 1970-01-01
    • 2017-08-08
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-29
    相关资源
    最近更新 更多