奇怪的JavaScript代码

时间:2011-07-08 12:35:43

标签: javascript

for (var i=a.length-1;i>0;i--) {
    if (i!=a.indexOf(a.charAt(i))) {
        a=a.substring(0,i)+a.substring(i+1);
    }
}

我在一个我正在审核的网络应用程序中找到了这个,它让我感到困惑,为什么它在那里。 我似乎无法看到i!=a.indexOf(a.charAt(i))错误的情况。

传递给它的值是:

a = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";

没有评论//叹气

1 个答案:

答案 0 :(得分:7)

对于重复的字符,情况也是如此,因为indexOf找到字符串的第一个索引,并且您正在搜索结尾。例如:

var a = "xyzxyz";

在第一次迭代时,i === 4a.charAt(4) === "x"a.indexOf("x") === 0。所以4 !== 0

然后设置a = a.substring(0, 4) + a.substring(5)。回忆substring包含在第一个索引中,但在最后一个索引中是独占的,这意味着在这种情况下a = "xyz" + "yz",因此我们从字符串中删除了重复的"x"

由于循环向后遍历,即使对于重复多次的字符,这仍将继续有效;您可以看到,a.substring(i + 1)部分将始终已被算法覆盖,即不包含任何重复项。


与往常一样,遇到这种类型的东西时,应用提取方法重构将是使代码更清晰的好方法。 (甚至比评论它更好!)所以如果你把它拉到一个方法中,代码就会变成a = removeDuplicateChars(a),每个人都会更开心。