![](/img/trans.png)
[英]Javascript, console.log prints prints object, but property is undefined
[英]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.