c-s*_*ile 10 javascript internet-explorer-9
显然,IE9中的JS实现包含处理数组文字的(IMO,严重)错误.
在IE9中,在某些情况下这段代码:
var a = [1,2,3,4,];
Run Code Online (Sandbox Code Playgroud)
将创建长度为5的数组,最后一个元素等于undefined.
以下是我的KiTE引擎测试页面的两个版本:
唯一的区别是第一个文档包含初始化为data.contacts的属性[1,2,3,4],第二个文档包含[1,2,3,4,].
内部IE调试器报告该data.contacts数组在第二种情况下包含5个元素.没有调试器,此代码在kite.js中的第98行失败(尝试获取undefined该data.content数组的第五个元素的属性)
问题:
更新:这里是测试http://jsfiddle.net/hmAms/,其中所有浏览器(包括IE9)都同意var a = [1,2,3,4,];长度为4 的事实.
Rob*_*obG 10
应忽略数组文字中的单个尾随逗号.两个尾随逗号是一个省略号,应该在数组的长度上添加一个逗号.所以:
alert( [1,2,3,4,].length ); // 4
alert( [1,2,3,4,,].length ); // 5
Run Code Online (Sandbox Code Playgroud)
某些版本的IE(<9?)将单个训练逗号视为一个elison并错误地将一个加到一个长度上,因此上面的结果是5和6的结果.这与ECMA-262§11.1.3不一致,因此是一个错误.
省略的目的是增加数组长度而不创建额外属性或直接指定长度,因此:
var x = [,1,,];
Run Code Online (Sandbox Code Playgroud)
相当于:
var x = new Array(3);
x[1] = 1;
Run Code Online (Sandbox Code Playgroud)
两种情况下的结果都应该是长度为3的数组和一个名为"1"且值为1的属性.前导逗号和尾随逗号对是符号,它们只影响长度,它们不创建属性.IE正确解释了前导逗号但错误地将两个尾随逗号解释为elisions,将长度增加了太多.
var x = [,1,,3,,];
var s = 'length: ' + x.length;
for (var p in x) {
s += '\nindex ' + p + ' has value ' + x[p];
}
alert(s);
Run Code Online (Sandbox Code Playgroud)
结果应该是:
length: 5
index 1 has value 1
index 3 has value 3
Run Code Online (Sandbox Code Playgroud)
顺便说一句,这个bug可能已经存在,因为IE允许数组文字,至少版本4(1997?).
| 归档时间: |
|
| 查看次数: |
3792 次 |
| 最近记录: |