Javascript 新数组(长度)给出了错误的大小

Javascript 新数组(长度)给出了错误的大小,javascript,firefox,Javascript,Firefox,更新:此错误影响v28及以后的v29 具有如下功能: function arrMany(len) { var a = new Array(len); } 如果函数被快速调用,则生成的数组的长度有时与先前调用函数的长度相同 将功能扩展为: function arrMany(len, show) { var a = new Array(len); if (show) { someElementTextA.value = a.length;

更新:此错误影响v28及以后的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

注:

  • 在浏览器控制台或Web控制台中不执行任何操作
  • 如果Web控制台处于打开状态,则不会发生错误
  • 如果在出现错误时打开Web控制台,它会立即更正自身
  • 给定pt。3.使用浏览器本身以理智的方式进行调试是相当困难的

  • 有什么好办法吗


    更新1: 已经在Firefox、Chrome和Opera上进行了测试。Firefox是唯一一个显示该漏洞的浏览器。控制台中没有操作

    来自评论和回答:不在WindowsXP、FirefoxV31上显示。在的系统上显示–即,它不是我的系统的本地


    更新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; }
    
    显示重试非常频繁


    另一个修复(如调试测试);但在另一方面。通过在函数中添加此项,数组的长度始终正确。如中所示:
    重试
    总是
    0

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

    至于这个问题。
    • 问题更多的是这个bug是否有好的修复方法,而不是它是否是一个bug
    关于发生这种情况的原因以及是否存在类似代码(例如,不处理数组)的任何信息也很有趣,但这不是原始问题的一部分


    更新3: 因为,“我想做什么”,这是一个关于它的一般意义上的问题,而不是具体的案例

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

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


    然后再次;反过来说,我想这将是反对使用它的另一个理由……;)

    它看起来像Firefox中的一个bug。此问题不会出现在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个元素。

    如果我理解正确,您希望解决此错误,即使它是一个丑陋的黑客攻击,只要它是可靠的。如果是这样,考虑这个方法,它显式初始化数组:

    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;
        }
    }
    
    函数arrmanny(w,show){
    //应该是:
    //var a=新阵列(w);
    //但是Firefox中有一个bug,请参见StackOverflow 22726716
    //
    var a=[];
    对于(var i=0;i
    这对我很有用:

    function arrMany(w, show) {
        (function () {
            var a = new Array(w);
            if (show) {
                arw1.value = a.length;
                arw2.value = w;
            }
        })();
    }
    
    有趣的阅读:

    此代码探索以下属性:

    (函数(){new Object();})()垃圾收集是否正确


    您是否检查了控制台以查看是否存在任何异常?@jdigital:是的,控制台处于静默状态。无法在WinXP上的FF 31上复制该值。如果该值最终正确,可能您的计算机无法跟上,这会导致许多排队的更新(我不知道浏览器内部,所以不知道它们是否崩溃事件)。我无法在Windows上重现此值:我确实看到了旧值,但它很快就被修复了。@jdigital:是的,但即使如此,数组长度也应该是指定的,因为它是函数的本地值。在我第一次遇到这个问题的代码中,被调用的函数根据长度对输入进行转换。因此,由于数组长度错误,结果会很混乱。感谢您确认错误。但问题仍然存在。这有什么好办法吗?;)。。。另外:哪个OS/Firefox版本?可能可以找到解决方法。如果我们能更好地了解你想做什么,会有帮助的。是的。这将是最好的。绝对不要使用
    新数组(sz)
    。对不起,我的问题含糊不清,我应该更清楚我的意图。考虑到(可能的)缺陷,我猜这接近于回答如何在一般意义上使用
    newarray(sz)
    。我已经用这种方法做了各种测试,但我无法用这种方法重现眼前的问题。我不是JavaScript引擎的专家,但我不认为我们可以把一切都归咎于
    新数组
    语法(至少不是唯一的罪魁祸首)。引擎正在做各种事情(包括各种优化)。虽然浏览器实现是单线程的,但事件可以以奇怪的方式交错,变量范围也可以以奇怪的方式重新排列。(见附件)。我肯定会提交一个bug(),看看firefox开发人员的反应如何。是的,根据v31,这个问题现在已经解决了。(v28-v30标记为受影响。)由JIT中新数组的内联等引起的错误