代码:
Unusual Array Lengths!
请注意数组声明中的额外逗号。上面的代码为各种浏览器提供了不同的输出:
野生动物园:5
火狐浏览器:5
即:6
数组中的额外逗号被 Safari 和 FF 忽略,而 IE 将其视为数组中的另一个对象。
在一些搜索中,我发现关于哪个答案是正确的意见不一。大多数人说 IE 是正确的,但 Safari 也在做与 Firefox 相同的事情。我没有在 Opera 等其他浏览器上对此进行测试,但我认为存在差异。
我的问题:
我。哪一个是正确的?
编辑:根据普遍共识(和 ECMAScript 指南),我们假设 IE 再次出错。
二. 还有其他我应该提防的 Javascript 浏览器怪癖吗?
编辑:是的,有很多 Javascript 怪癖。www.quirksmode.org是一个很好的资源。
三. 如何避免此类错误?
编辑:使用JSLint验证您的 javascript。或者,使用一些外部库。或者,清理您的代码。
感谢DamienB、JasonBunting、John和Konrad Rudolph的投入。
在我看来,Firefox 的行为是正确的。IE 中第 6 个值的值是多少(抱歉,我没有方便的测试)。由于没有提供实际值,我想它会用类似“null”的东西填充它,这肯定不是您在创建数组时想要发生的事情。
不过归根结底,哪个“正确”并不重要,因为现实情况是要么你只针对一个浏览器,在这种情况下你可以忽略其他浏览器,要么你针对多个浏览器在这种情况下,您的代码需要处理所有这些。在这种情况下,显而易见的解决方案是永远不要在数组初始值设定项中包含悬挂逗号。
如果您在避免它时遇到问题(例如,由于某种原因您已经养成了包含它的(坏的,恕我直言)习惯)和其他类似的问题,那么像JSLint这样的东西可能会有所帮助。
我很好奇,所以我在 ECMAScript 262 版的定义中查找了它。3这是 JavaScript 1.8 的基础。相关定义可在第 11.1.4 节中找到,不幸的是不是很清楚。该部分明确指出开头或中间的省略(= 遗漏)不会定义元素,但会影响总长度。
初始化程序末尾没有关于冗余逗号的明确声明,但由于遗漏,我得出结论,上述声明暗示它们对总长度没有贡献,因此我得出结论, MSIE 是错误的。
相关段落如下:
数组元素可以在元素列表的开头、中间或结尾省略。每当元素列表中的逗号前面没有赋值表达式(即逗号在开头或在另一个逗号之后)时,缺少的数组元素会增加数组的长度并增加后续元素的索引。未定义省略的数组元素。
“3”对于那些情况,我通常把我的脚本
if(!arrayList[arrayList.length -1]) arrayList.pop();
你可以用它做一个效用函数。
首先,康拉德引用规范是正确的,因为它定义了语言并回答了您的第一个问题。
回答你的其他问题:
还有其他我应该提防的 Javascript 浏览器怪癖吗?
哦,太多了,无法在这里列出!试试QuirksMode 网站,找一个几乎可以找到所有已知信息的好地方。
如何避免此类错误?
最好的方法是使用一个为您抽象出这些问题的库,这样您就可以开始担心应用程序的逻辑了。虽然有点深奥,但我更喜欢并推荐MochiKit。
哪一个是正确的?
Opera 也返回 5。这意味着 IE 的数量超过了您的期望,并且多数规则如您所料。
Ecma 262 edition 5.1 section 11.1.4 array initializer 指出,如果数组对数组的长度没有贡献,则末尾有一个逗号。“如果一个元素在数组的末尾被省略,它不会影响数组的长度”
这意味着 [ "x", ] 是完全合法的 javascript,应该返回一个长度为 1 的数组
@John:arrayList[5] 的值结果为“未定义”。
是的,声明中永远不应该有逗号。实际上,我只是在浏览别人的长长的 javascript 代码,这些代码在不同的浏览器中无法正常工作。原来,悬空的逗号是不小心输入的罪魁祸首!:)
谢谢你,谢谢你,谢谢你!!!一个愚蠢的额外逗号导致 IE8 的行为与 FireFox 不同,这让我感到困惑,试图找出它!
感谢您提出这个问题,帮助我解决了我遇到的 IE 未按预期处理数组的问题。:)