Javascript Funky阵列不幸事件

时间:2011-12-06 05:25:10

标签: javascript arrays

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引领我到这一点,到目前为止一直是一个巨大的帮助。

修改

Runnable example on JSFiddle

5 个答案:

答案 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工具的一个错误