Internet Explorer(7/8)无法循环遍历javascript数组

时间:2012-03-22 09:41:17

标签: javascript internet-explorer internet-explorer-8 internet-explorer-7

我需要用字符串替换非重音字符串中的重音字符,然后我实现了http://lehelk.com/2011/05/06/script-to-remove-diacritics/

var defaultDiacriticsRemovalMap = [
            {'base':'A', 'letters':/[\u0041\u24B6\uFF21\u00C0\u00C1\u00C2\u1EA6\u1EA4\u1EAA\u1EA8\u00C3\u0100\u0102\u1EB0\u1EAE\u1EB4\u1EB2\u0226\u01E0\u00C4\u01DE\u1EA2\u00C5\u01FA\u01CD\u0200\u0202\u1EA0\u1EAC\u1EB6\u1E00\u0104\u023A\u2C6F]/g},   
            /* ... 
            so on and so forth
            .... */
        ];

        var changes;
        function removeDiacritics (str) {
            if(!changes) {
                changes = defaultDiacriticsRemovalMap;
            }
            for(var i=0; i<changes.length; i++) {
                str = str.replace(changes[i].letters, changes[i].base);
            }
            return str.replace(/\s+/g, '_'); //space to dash
        }

这在IE 7和8中失败(在所有其他浏览器中都有效),行'changes[...].letters' is null or not an object上的错误str = str.replace(changes[i].letters, changes[i].base);,我不明白为什么。我的意思是,我知道浏览器认为它遇到了空值,但我看不出这是怎么回事。

我将我的代码复制到jsfiddle(它也会在那里激发相同的错误),所以你可以看看它。

http://jsfiddle.net/GggcU/

3 个答案:

答案 0 :(得分:3)

我不确定这是你的问题,因为你没有粘贴整个代码,但我确信如果你在数组的最后一个元素之后添加一个额外的逗号,IE7 / 8会抛出一个错误。

所以,如果你有这样的事情:

var defaultDiacriticsRemovalMap = [
 {'base':'A'},   
 {'k1':'v1'},
 ...
 {'k_last':'v_last'}, // this last comma will break your js in IE7/8
];

答案 1 :(得分:2)

几乎可以肯定,数组中有一个尾随逗号。 IE将其视为一个省略并添加一个长度,有效地添加了一个额外的(未定义的)成员。其他浏览器正确忽略它。无论如何,请将其删除。

只是为了展示IE如何处理逗号:

var a = [0,1,];

alert(a.length); // 3 in IE, 2 in others

alert(a.hasOwnProperty('2')); // false in all browsers

尾随逗号不是一个省略号,需要两个尾随逗号。

答案 2 :(得分:1)

在数组的右括号(] )之前有一个额外的逗号(),IE7 / 8然后为此数组添加额外的undefined值,所以当使用for迭代循环时,IE7 / 8在索引84时会遇到值undefined(尝试记录changes.length并看到差异)