JavaScript时髦的数组事故

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将我引向了这一点,并且迄今为止一直是一个巨大的帮助。

编辑

JSFiddle上的可运行示例


这是console.log一个已知问题。

在调用方法时,不要将参数转换为字符串,而是在用户界面中显示参数时将其存储并转换为字符串。 由于在函数运行时用户界面中没有任何事情发生,您将看到当您退出函数时的对象状态。


我不认为这是一个JavaScript wtf; 我认为这是一个console.log wtf。 基于我昨天看到的答案, console.log可能会缓存您的对象。 如果用alert(b)替换console.log(b) ,您会看到b按预期显示。

不幸的是令人信服的console.log以可预见的方式行事并不是我想要的答案。


我假设这与console.log()工作方式有关,但是当你说:

b = b.push("bb");

你应该可以说

b.push("bb");
链接地址: http://www.djcxy.com/p/18033.html

上一篇: Javascript Funky array mishap

下一篇: Does IE9 support console.log, and is it a real function?