带有数组赋值的Javascript意外控制台输出;

Javascript unexpected console output with array assignment;

本文关键字:意外 控制台 输出 Javascript 数组 赋值      更新时间:2023-09-26

在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最终执行时,而不是在调用它时,传递给console.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);
}

这似乎不是人们想要的行为。

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

你可以做一个快速:

console.log(myArray.slice());

而是出于调试目的。


为了更明显地测试这一点:

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

将给出CCD_ 3。

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

给出了t=5的错误结果和t=100的正确结果。