奇怪的JavaScript代码

Joh*_*ohn 3 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

传递给它的值是:

a = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
Run Code Online (Sandbox Code Playgroud)

无论是叹息还是没有评论

Dom*_*nic 7

对于重复的字符,这是正确的,因为indexOf找到字符串的第一个索引,并且您从最后搜索.例:

var a = "xyzxyz";
Run Code Online (Sandbox Code Playgroud)

在第一次迭代时,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),每个人都会更开心.