如果我创建以下代码块:
<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?难道第一个打印的东西不应该是一个空的关联数组吗?
答案 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)))