用深拷贝解决console.log的中对象的调试问题

用深拷贝解决console.log的中对象的调试问题

var obj={aa:1}
console.log(obj);
obj.aa=2
console.log(obj);

运行上面一段代码。为了跨越console.log的异步特性,将上述代码一句一句在控制台里执行,这样尅忽略异步或者多线程的问题。

然后观察结果,发现输出了两个object。鼠标点开的时候会看到对象的内容,但是发现两个object的内容是一样的。
也就是说,这种情况下,不管是何时输出的obj,点开后看到的都是最后obj的值,而不是输出的时候对象的值。
可能是因为consolelog只是输出一个对象的引用,鼠标点开的时候,会去内存里取这个引用,取到的当然总是最后的值。
这个时候,如果需要实时调试,那就需要对象深拷贝了。原理很简单:

 var object_copy=function(obj){
            var cache={}
            for(var i in obj){
                if(typeof(obj[i])=="object"){
                    cache[i]=object_copy(obj[i])
                }else{
                    cache[i]=obj[i]
                }
            }
            return cache;
        }

这里有递归操作,如果页面里有大量这样的调试的话,可能会内存溢出或者堆栈溢出,小心小心。

来源:http://www.html-js.com/?p=1333

console.log异步特性的事例:

var ret = [1, 2, 3, 4, 5, 3, 2, 5, 7, 8],
length = ret.length,
middle = length/2,
n, r;

console.log(ret); // [1, 2, 3, 4, 5, 7, 8, undefined × 3]

for ( n = middle; n < ret.length; n++ ) {
for ( r = 0; r < middle; r++ ) {
if ( ret[r] === ret[n] ) {
ret.splice(n--, 1);
break;
}
}
}

console.log(ret); // [1, 2, 3, 4, 5, 7, 8]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值