Javascript浏览器怪癖-array.Length
代码:
<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浏览器怪癖吗?
编辑:是的,有大量的Java语言怪癖。 www.quirksmode.org是一个很好的资源。
iii。如何避免此类错误?
编辑:使用JSLint来验证javascript。或者,使用一些外部库。或者,清理代码。
感谢DamienB,JasonBunting,John和Konrad Rudolph的投入。
解决方案
回答
在这种情况下,我通常会在脚本中输入" 3"
if(!arrayList[arrayList.length -1]) arrayList.pop();
我们可以利用它来实现实用程序功能。
回答
我很感兴趣,因此我在ECMAScript 262 ed的定义中进行了查找。 3这是JavaScript 1.8的基础。相关定义在第11.1.4节中找到,不幸的是,它不是很清楚。本节明确指出,开头或者中间的省略号(=省略)并未定义元素,但确实有助于整体长度。
在初始化程序的末尾没有关于冗余逗号的明确声明,但是通过省略,我得出结论,上述声明暗示它们对总长度没有帮助,因此我得出结论,MSIE是错误的。
相关段落如下:
Array elements may be elided at the beginning, middle or end of the element list. Whenever a comma in the element list is not preceded by an Assignment Expression (i.e., a comma at the beginning or after another comma), the missing array element contributes to the length of the Array and increases the index of subsequent elements. Elided array elements are not defined.
回答
在我看来,Firefox的行为是正确的。 IE中第6个值的值是多少(对不起,我没有方便测试的值)。由于没有提供实际值,因此我想用" null"之类的值来填充它,这肯定不是我们创建数组时想要的。
归根结底,"正确"并不重要,因为现实是我们只针对一个浏览器,在这种情况下,我们可以忽略其他浏览器的功能,或者我们针对的是多个浏览器。在这种情况下,代码需要对所有代码都起作用。在这种情况下,显而易见的解决方案是永远不要在数组初始值设定项中包含悬空逗号。
如果我们在避免使用它方面遇到问题(例如,由于某种原因,我们养成了(坏,恕我直言)包含它的习惯)和类似的其他问题,那么类似JSLint的方法可能会有所帮助。
回答
@John:arrayList [5]的值显示为"未定义"。
是的,声明中绝对不能有逗号。实际上,我只是在浏览别人长长的javascript代码,而这些代码却在不同的浏览器中无法正常工作。原来,悬挂的逗号是偶然输入的罪魁祸首! :)
回答
首先,Konrad引用了规范是正确的,因为这是定义语言并回答第一个问题的权利。
要回答其他问题:
Are there any other such Javascript browser quirks that I should be wary of?
哦,这里太多了!尝试使用QuirksMode网站找到一个几乎所有已知的好地方。
How do I avoid errors such as these?
最好的方法是使用一个为我们抽象这些问题的库,这样我们就可以开始担心应用程序的逻辑。虽然有点深奥,但我还是推荐MochiKit。
回答
Which one of these is correct?
Opera也会返回5. 这意味着IE的数量超出了预期,多数规则已达到预期。