带有数组分配的 Javascript 意外控制台输出;

标签 javascript google-chrome webkit console

我在 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 中收到 [] 的预期输出。

[编辑]

当我插入长时间同步 sleep 时,问题并没有消失。这让我认为 (1) 即使 console.log 语句是异步的,它也在同一个线程中运行,并且 (2) 它在运行之前等待事件队列为空,以及 (3) 传递给控制台的引用.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);

将给出 [1, 2, 3, 4, 5]

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

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

关于带有数组分配的 Javascript 意外控制台输出;,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9004981/

相关文章:

javascript - node_modules有很多我不知道的文件

javascript - 可以在不使用中间件函数的情况下增强 express.js req 和 res 变量吗?

html - Chrome 元素检查器与实际呈现的元素不对齐

javascript - 如何在 Chrome 上替换已弃用的 "svgElement.offsetWidth/height"

google-chrome - 丢失的 Chrome 标签,真的有些愚蠢的情况仍然可以挽救吗?

css - WebKit CSS Inspector 的样式禁用复选框应向左移动以提高可用性

javascript - 如何在不更改页眉和页脚的情况下更改html页面中的内容位置

javascript - 使用javascript更改文本颜色和背景颜色

javascript - iOS Safari 上的 webkitAudioContext createMediaElementSource 无法正常工作

jquery - 在 Webkit 浏览器中悬停后的 CSS3 动画速度不正确