javascript - new Array(length) 给出了错误的大小

标签 javascript firefox

更新:此错误影响 v28 和 was fixed对于 v29 以后。


具有这样的功能:

function arrMany(len) {
    var a = new Array(len);
}

如果快速调用函数,生成的数组的长度有时会是上一次函数调用的长度。

将函数扩展为:

function arrMany(len, show) {
    var a = new Array(len);
    if (show) {
        someElementTextA.value = a.length;
        someElementTextB.value = len;
    }
}

并通过例如调用:

function tick() {
    arrMany(2);
    arrMany(4);
    arrMany(6);
    arrMany(10, true);
}

setInerval(tick, 1000 / 200);

一段时间后 someElementTextA 显示值 6 而不是 10

当发生这种情况时,将 fps 调低到例如 1,它会在很长一段时间内不断吐出错误的长度。


该行为通常会在我的系统上大约 20 秒后自行显现。

测试于:Firefox Linux i686; rv:28.0

注意事项:

  1. 浏览器控制台Web 控制台 中没有任何操作。
  2. 如果 Web Console 打开,则永远不会发生错误。
  3. 如果在出现错误时打开了 Web 控制台,它会立即自行更正。
  4. 给出点。 3. 很难使用浏览器本身以理智的方式进行调试。

对此有什么好的解决办法吗?


更新 1:

已在 Firefox、Chrome 和 Opera 上测试过。 Firefox 是唯一出现该错误的浏览器。控制台中没有任何操作。

来自评论和回答:在 Window XP、Firefox v31 上不显示。是否显示在 @jdigital的系统——即它不是我系统的本地系统。


更新 2:

在上面的代码中始终指定 show 没有任何区别。

function tick() {
    arrMany(2, false);
    arrMany(4, false);
    arrMany(6, false);
    arrMany(10, true);
}

也不使用默认参数。但还有一点是,show只是为了方便示例代码。


关于难题说法的解决方案:

if (arr.length !== len) { arr = new Array(len); }

似乎有效。但不确定这是否是一个修复,或者这是否可以以同样的方式中断。使用

if (arr.length !== len) { arr = new Array(len); retry = 1; }

表明重试非常频繁。


另一个修复,(在调试测试中);但以另一种方式。通过在函数中添加这个,数组的长度总是正确的。如:retry 始终为 0

for (retry = 0; arr.length !== len && retry < 10; ++retry) {
    arr = new Array(len);
}

至于问题。

  • 问题更多的是该错误是否有任何好的修复,而不是它是否是错误。

关于为什么发生这种情况的任何信息,以及是否有任何类似的代码,例如不处理数组,可以以相同的方式中断也很有趣,但不是原始问题的一部分。


更新 3:

对于,“我想做什么”,这是一个一般意义上的问题,而不是特定于一个案例。

这不是我通常使用的语法,但时常发生,通常在一些调试或详细输出中使用稀疏数组比循环更简单。但很高兴知道它可靠。

与此同时,我认识到其他人可能有不同的需求,因此从广义上讲,拥有这样的解决方案总是很好。

再一次;反过来我想这将是反对使用它的另一个论点......;)

最佳答案

这对我有用:

function arrMany(w, show) {
    (function () {
        var a = new Array(w);
        if (show) {
            arw1.value = a.length;
            arw2.value = w;
        }
    })();
}

有趣的阅读: JavaScript's Strange Threaded Nature

这段代码探讨了以下属性:

(function() { new Object(); })(); is garbage collected properly

关于javascript - new Array(length) 给出了错误的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22726716/

相关文章:

javascript - json 和 javascript 新手,有帮助吗?

javascript - 从 firefox 插件注入(inject)一行 JavaScript

css - 垂直居中的 100% 高度 div 在 Firefox 中没有到达顶部

javascript - 通过 AJAX 查找链接并绑定(bind)它们相同的操作,无需重复定义

javascript - JQuery 根据 HTML 下拉选择查找并替换 URL 中的查询字符串

javascript - 另一个 ajax 调用 (a) 的回调中的 Ajax 调用 (b) 在 (a) 完成之前执行

selenium - 仅使用终端安装 geckodriver

javascript - HTML canvas drawImage 不能正常用于横向图像

html - 为什么 Google 搜索在使用 FireFox 和 Chrome 时表现不同?

firefox - 使用 Selenium WebDriver 使用 Firefox 'print' 或 'save as' 功能