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

来源:互联网 发布:销售软件哪个好用 编辑:程序博客网 时间:2024/06/11 20:17

用深拷贝解决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] 

原创粉丝点击