function a() {
var b = ["b"];
console.log(b);
//console.log(b.slice());
b = b.push("bb");
}
a();
在一个“完美”的世界里,你会认为console.log
会显示["b"]
,但是它会显示["b", "bb"]
,尽管“bb”直到事后才被推迟。
如果您执行console.log(b.slice());
那么您将获得["b"]
所需的结果。这是为什么?这种并发症背后的原因是什么?我只是想更好地理解这一点,所以我可以更好地避免它发生。
*注意我在最近的一个问题中遇到了同样的观点,但这是一个更简洁的例子。 @RightSaidFred引领我到这一点,到目前为止一直是一个巨大的帮助。
答案 0 :(得分:15)
这是known problem console.log
。
在调用方法时,不是将参数转换为字符串,而是在UI中显示参数时将其存储并转换为字符串。当函数运行时,UI中没有任何反应,您将看到退出函数时对象的状态。
答案 1 :(得分:7)
我不认为这是一个JavaScript wtf;我认为这是一个console.log wtf。基于我昨天看到的答案,console.log
可能会缓存您的对象。如果您将console.log(b)
替换为alert(b)
,则会看到b
按预期显示。
不幸的是说服console.log以可预测的方式运行是而不是我有答案的东西。
答案 2 :(得分:4)
我认为这与console.log()
的工作方式有关,尽管当你说:
b = b.push("bb");
你应该能够说出
b.push("bb");
答案 3 :(得分:4)
确认(如果需要)Guffa的回答:
function a() {
var b = ["b"];
console.log (b);
console.log (' ' + b);
console.log (b);
console.log (b.toString ());
console.log (b);
b = b.push("bb");
console.log (b);
}
a();
Chrome输出:
["b", "bb"]
b
["b", "bb"]
b
["b", "bb"]
2
注意引用该对象的每个日志如何显示“anomolous”结果,而每个需要评估表达式的日志都不会。另请注意最终日志,它显示b设置为值2,因为push返回的值是数组的新长度。
因此,要避免此问题,请确保每个日志参数都涉及表达式的计算。
答案 4 :(得分:2)
我认为这是google chrome dev工具的一个错误