深度克隆JS对象

这篇简短的文章介绍了一种可用于创建javascript对象的“深拷贝”的方法。 您可能会问:“我们为什么需要这个?” ...答案:“仅基本数据类型的变量值是字符串,int,float,boolean,并且为了使混淆更加完美:)也起作用! 按值传递,所有其他按引用传递。” 这意味着,当您创建对象a时(如下面的代码所示),并将对象a分配给变量b时,您将通过引用传递对象a。 结果是,当您为b.foobar分配新值时,a.foobar将会相应地更改。 要按值传递值,可以想像为对象a的(深层)副本,我们必须使用一个函数,将对象a内任何数据结构的值递归复制到对象b。


// example object that might be cloned
var a = {
   foo   : { test: 1, test1: 2 },
   bar   : function(a) { alert(a) },
   foobar: 'foobar1',
   arr   : [1, [8, 9], {1: 1, 2: 2}, 4]
}; 
/**
 * function clone_obj deep-clones an js-object
 *
 * @param obj javascript-object
 * @return c cloned javascript-object
 */
function clone_obj(obj) {
    if (typeof obj !== 'object' || obj == null) {
        return obj;
    } 
    var c = obj instanceof Array ? [] : {}; 
    for (var i in obj) {
        var prop = obj[i]; 
        if (typeof prop == 'object') {
           if (prop instanceof Array) {
               c[i] = []; 
               for (var j = 0; j < prop.length; j++) {
                   if (typeof prop[j] != 'object') {
                       c[i].push(prop[j]);
                   } else {
                       c[i].push(clone_obj(prop[j]));
                   }
               }
           } else {
               c[i] = clone_obj(prop);
           }
        } else {
           c[i] = prop;
        }
    } 
    return c;
} 
// usage: we clone object a to object b
var b = clone_obj(a); 
注意:为什么我们不能使用该功能复制dom节点? 答:dom-nodes包含对其父对象和子对象等的引用。使用上述方法复制该对象时,我们会得到一个错误:“太多的递归” ...因为复制父对象时,我们来到了一个子对象然后从那里到它的父节点,等等...为了克隆dom节点,我们可以简单地使用cloneNode()dom方法。

测试人员需要;)...我认为它的工作方式应该...但我可能忽略了某些东西吗?

testing-help:在firebug控制台中进行测试时,测试场景例如可以是:

var a = {
   foo   : { test: 1, test1: 2 },
   bar   : function(a) { alert(a) },
   foobar: 'foobar1',
   arr   : [1, [8, 9], {1: 1, 2: 2}, 4]
}; 
var c = a;
c.foobar = 'new test'; 
function clone_obj(obj) {
    if (typeof obj !== 'object' || obj == null) {
        return obj;
    } 
    var c = obj instanceof Array ? [] : {}; 
    for (var i in obj) {
        var prop = obj[i]; 
        if (typeof prop == 'object') {
           if (prop instanceof Array) {
               c[i] = []; 
               for (var j = 0; j < prop.length; j++) {
                   if (typeof prop[j] != 'object') {
                       c[i].push(prop[j]);
                   } else {
                       c[i].push(clone_obj(prop[j]));
                   }
               }
           } else {
               c[i] = clone_obj(prop);
           }
        } else {
           c[i] = prop;
        }
    } 
    return c;
} 
var b = clone_obj(a);
b.foobar = 'test';
b.bar = function(a) { alert(a + a) }; 
console.info(a.toSource());
console.info(b.toSource()); 

From: https://bytes.com/topic/javascript/insights/718427-deep-cloning-js-objects

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值