Javascript 新数组(长度)给出了错误的大小
更新:此错误影响v28及以后的v29Javascript 新数组(长度)给出了错误的大小,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;
具有如下功能:
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
这种行为通常在我的系统上大约20秒后表现出来 测试环境:Firefox Linux i686;rv:28.0 注:
有什么好办法吗
更新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中新数组的内联等引起的错误