繁体   English   中英

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

[英]Javascript console.log prints values before they are set

如果我创建以下代码块:

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

为什么会这样? 第一次打印“目标”时值如何为5? 第一个打印的东西不应该是一个空的关联数组吗?

实际上,您可以在这里看到: 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:” {[functions ::, proto :{}}

first:[object Object]“ first:” {[functions ::, proto :{}}

first:[object Object]“ first:” {[functions ::, proto :{}}

first:[object Object]“ first:” {[functions ::, proto :{}}

first:[object Object]“ first:” {[functions ::, proto :{}}

(因此,在firefox中,我总是获得“源”的值,在IE10中始终记录一个空对象)

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

这是因为尽管您先打印链接,然后再修改链接,但对象却被更改了...

在这里,我尝试立即打印与链接相同的全新对象...因此,即使链接对象被修改,打印的对象也不会

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM