Javascript console.log在设置之前打印值

时间:2014-07-08 08:45:17

标签: javascript

如果我创建以下代码块:

<script language="JavaScript" type="text/javascript" src="jquery-2.1.1.js"></script>
<script type = "text/javascript">
x = [1,2,3,4,5,6]
new_list = []
for (i = 0; i < x.length-1; i++) {
    var links = {}
    console.log("first:", links)

    for (j = i+1; j < x.length; j++) {
        links["source"] = i
        links["target"] = j
    }
}
//document.write('<b>End of script.</b>');
</script>

理论上,控制台应该打印{},{source:0,target 1},{source:0,target:2},... 实际上,它打印:

"first:" {source: 1, target: 5} Test1.html:7
"first:" {source: 2, target: 5} Test1.html:7
"first:" {source: 3, target: 5} Test1.html:7
"first:" {source: 4, target: 5}

为什么会这样?如何定位&#39;第一次打印时值是5?难道第一个打印的东西不应该是一个空的关联数组吗?

2 个答案:

答案 0 :(得分:1)

实际上,正如您在此处所见:https://developer.mozilla.org/en-US/docs/Web/API/console

  

控制台对象提供对浏览器调试控制台的访问(例如Firefox中的Web控制台)。其工作原理的具体细节因浏览器而异,但通常会提供一组事实上的功能。

标准中未指定window.console对象(以及window.console.log)行为。 “怪异”行为不是由于您的代码(执行完全符合预期),而是由于console.log延迟评估(至少在您的浏览器中)。


运行这个小提琴:http://jsfiddle.net/6dQB8/

在Firefox30中输出:

"first:" Object { source: 0 } _display:25
"first:" Object { source: 1 } _display:25
"first:" Object { source: 2 } _display:25
"first:" Object { source: 3 } _display:25
"first:" Object { source: 4 } _display:25

在IE10输出中

  

文件:首先是jsfiddle.net:[object Object]“first:”{         [功能]: ,          proto :{}}

     

首先:[object Object]“first:”{         [功能]: ,          proto :{}}

     

首先:[object Object]“first:”{         [功能]: ,          proto :{}}

     

首先:[object Object]“first:”{         [功能]: ,          proto :{}}

     

首先:[object Object]“first:”{         [功能]: ,          proto :{}}

(所以,在firefox中我总是得到“source”的值,在IE10中Ialways记录一个空对象)

结论:使用可变对象时不要依赖console.log:)

答案 1 :(得分:0)

这是因为虽然您先打印链接并稍后修改它们,但对象会被更改...

这里我尝试在那个瞬间打印一个与链接相同的全新对象......所以即使链接对象被修改,打印对象也不会

console.log("first:",JSON.parse(JSON.stringify(links)))