Javascript浏览器怪癖 - array.Length

时间:2008-08-26 22:00:39

标签: javascript

代码:

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>Unusual Array Lengths!</title>

    <script type="text/javascript">
        var arrayList = new Array();
        arrayList = [1, 2, 3, 4, 5, ];
        alert(arrayList.length);
    </script>

</head>
<body>
</body>
</html>

注意数组声明中的额外逗号。 上面的代码为各种浏览器提供了不同的输出:

Safari:5

Firefox:5

IE:6

数组中的额外逗号被Safari和FF忽略,而IE将其视为数组中的另一个对象。

在一些搜索中,我发现关于哪个答案是正确的意见不一。大多数人都说IE是正确的,但后来Safari也和Firefox做同样的事情。我没有在Opera等其他浏览器上测试过,但我认为存在差异。

我的问题:

我。 哪一个是正确的?

编辑:根据一般共识(和ECMAScript指南),我们假设IE再次出现错误。

II。 我是否应该警惕其他任何此类Javascript浏览器怪癖?

编辑:是的,有大量的Javascript怪癖。 www.quirksmode.org是一个很好的资源。

III。 如何避免这些错误?

编辑:使用JSLint验证您的JavaScript。或者,使用一些外部libraries。或者,sanitize您的代码。

感谢DamienBJasonBuntingJohnKonrad Rudolph的输入。

7 个答案:

答案 0 :(得分:9)

在我看来,Firefox的行为是正确的。 IE中第6个值的值是多少(对不起,我没有方便测试)。由于没有提供实际值,我想它正在填充类似'null'的东西,当然,这似乎不是你在创建数组时想要发生的事情。

但是,在一天结束时,哪个“正确”并不重要,因为现实情况是您要定位一个浏览器,在这种情况下您可以忽略其他人的操作,或者您要定位多个浏览器,在这种情况下,您的代码需要处理所有这些。在这种情况下,显而易见的解决方案是永远不要在数组初始值设定项中包含悬空逗号。

如果你在避免它时遇到问题(例如由于某些原因你已经养成了(包括它的那种(坏的,imho)习惯)和其他类似的问题,那么JSLint之类的东西可能会有所帮助。

答案 1 :(得分:7)

我很感兴趣所以我在ECMAScript 262 ed. 3的定义中查找了它,这是JavaScript 1.8的基础。相关定义见第11.1.4节,遗憾的是不太清楚。该部分明确指出开头或中间的元素(=遗漏)没有定义元素,但确实有助于整体长度

在初始化程序的末尾没有关于冗余逗号的明确陈述,但是由于省略,我得出结论,上述陈述暗示它们对总长度有贡献所以我得出结论 MSIE错误

有关段落内容如下:

  

可以在元素列表的开头,中间或末尾省略数组元素。每当元素列表中的逗号前面没有赋值表达式(即,开头处的逗号或另一个逗号之后的逗号)时,缺少的数组元素将贡献数组的长度并增加后续元素的索引。未定义Elided数组元素。

答案 2 :(得分:3)

“3”对于那些情况,我通常会放入我的脚本

if(!arrayList[arrayList.length -1]) arrayList.pop();

你可以用它来制作一个实用功能。

答案 3 :(得分:2)

首先, Konrad 引用规范是正确的,因为这是定义语言并回答您的第一个问题。

回答您的其他问题:

  

还有其他类似的Javascript浏览器怪癖我应该警惕吗?

哦,这里列出太多了!尝试 the QuirksMode website 找个好地方找到所有已知的内容。

  

如何避免这些错误?

最好的方法是使用a library来消除这些问题,以便您可以开始担心应用程序的逻辑。虽然有点深奥,但我更喜欢并推荐MochiKit

答案 4 :(得分:1)

  

其中哪一个是正确的?

Opera也会返回5.这意味着IE数量超过了大多数,并且大多数规则都是您应该期望的。

答案 5 :(得分:1)

Ecma 262版本5.1第11.1.4节数组初始值设定项声明如果数组对数组的长度没有贡献,则结尾处有逗号。 &#34;如果一个元素在数组的末尾被省略,则它不会影响数组的长度&#34;

这意味着[&#34; x&#34;,]是完全合法的javascript,应该返回一个长度为1的数组

答案 6 :(得分:0)

@John:arrayList [5]的值为'undefined'。

是的,声明中永远不应该有悬空的逗号。实际上,我只是通过别人的长篇javascript代码,不知何故在不同的浏览器中无法正常工作。原来,悬空的逗号是意外输入的罪魁祸首! :)