【问题标题】:Javascript unexpected console output with array assignment;带有数组分配的 Javascript 意外控制台输出;
【发布时间】:2012-02-18 18:30:11
【问题描述】:

在 webkit 浏览器(Chrome 16.0.912.77 和 Safari 5.1.2 - 7534.52.7)中分配数组后,我得到了意外的控制台输出。

这是我演示错误的函数:

function test() {
    var myArray = [];
    console.log(myArray); // Should be [], but is [0]
    myArray.push(0);
}

我在 Firefox 7.0.1 中收到 [] 的预期输出。

[编辑]

当我插入一个长同步睡眠时,问题并没有消失。这让我觉得(1)即使 console.log 语句是异步的,它也在同一个线程中运行,(2)它在运行之前一直等到事件队列为空,以及(3)传递给控制台的引用当 console.log 最终执行时,.log 被转换为字符串 - 而不是在调用它时。

function sleep(millis){
  var date = new Date();
  var curDate = null;
  do { curDate = new Date(); }
  while(curDate-date < millis);
}

function test() {
    var myArray = [];
    console.log(myArray); // Should be [], but is [0]
    sleep(2000);    
    myArray.push(0);
}

这似乎不是理想的行为。

【问题讨论】:

  • 你确定这不仅仅是一个命名的东西,它是一个大小为 0 的数组吗?您是否尝试过在 webkit 浏览器中访问 myArray[0]?
  • 关于您的编辑,请参阅可能的重复问题。在代码完成时评估结果。所以没有同步等待。请改用.concat().join()

标签: javascript google-chrome webkit console


【解决方案1】:

这是因为console.log 是通过引用和异步的,而您的push() 最终会在结果显示之前执行。

你可以做一个快速:

console.log(myArray.slice());

而是出于调试目的。


为了更清楚地测试这一点:

var a = []; console.log(a); a.push(1, 2, 3, 4, 5);

会给[1, 2, 3, 4, 5]

var a = []; console.log(a); setTimeout(function() {a.push(1, 2, 3, 4, 5);}, t);

在 t = 5 时给出了错误的结果,在 t = 100 时给出了正确的结果。

【讨论】:

  • 您的解释是有道理的,但它似乎不是有用的行为。如果您不能信任它的输出(或者必须非常小心地信任它),那么 console.log 有什么用?此外,当我在日志语句和推送之间插入延迟时,我会得到相同的行为。
  • @bbrame:我想它并不是真的打算这样使用;至于它是异步的原因,那是为了性能。当您 console.log 一个 HTML 元素时,它会将其呈现为一棵树。登录jQuery('*'),它会挂起你的 JavaScript。
  • @bbrame:不,它没有用,并被列为执行此操作的浏览器的错误。一些浏览器的行为不同。
  • @bbrame: console.log 这样代码就可以在不显眼的情况下提醒开发人员存在问题。当需要解决问题时,它不能替代交互式调试器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-29
  • 2011-06-27
相关资源
最近更新 更多