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

时间:2014-03-29 03:44:43

标签: javascript firefox

更新: 此错误会影响v28和was fixed for v29 for。


有这样的功能:

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控制台处于打开状态,则不会发生错误。
  3. 如果错误显示时打开了 Web控制台,它会立即自行更正。
  4. 鉴于pt。 3.使用浏览器本身以一种理智的方式进行调试是相当困难的。

  5. 对此有什么好的解决方法吗?


    更新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:

    对于,“我要做的事情”,这是一般意义上的问题,并非针对案例。

    这不是我通常使用的语法,但有时会发生,通常在某些调​​试或详细输出中,使用稀疏数组 simpler 然后是循环。但很高兴知道可靠。

    与此同时,我认识到其他人可能有不同的需求,因此在广义的一般意义上,解决方案总是很好。

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

3 个答案:

答案 0 :(得分:2)

这对我有用:

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(); })();正确收集垃圾

答案 1 :(得分:1)

它看起来像Firefox中的一个错误。 Chrome等中不会出现此问题 当我添加日志声明时:

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

运行时,我可以看到偶尔会触发console.log,Firefox Web控制台窗口显示该数组有5个元素。

答案 2 :(得分:1)

如果我理解正确,你想要一个解决这个bug的方法,即使它是一个丑陋的黑客,只要它是可靠的。如果是这样,请考虑这种显式初始化数组的方法:

function arrMany(w, show) {
    // should be:
    //      var a = new Array(w);
    // but there's a bug in Firefox, see StackOverflow 22726716
    //
    var a = [];
    for( var i = 0; i < w; i++ ) a[i] = undefined;

    if (show) {
        arw1.value = a.length;
        arw2.value = w;
    }
}