字符串上的Array.sort

4
有人知道为什么在字符串上调用Array.sort是非法的吗?
[].sort.call("some string")
// "illegal access"

但是调用Array.map、Array.reduce或Array.filter是可以的吗?
[].map.call("some string", function(x){ 
    return String.fromCharCode(x.charCodeAt(0)+1); 
});
// ["t", "p", "n", "f", "!", "t", "u", "s", "j", "o", "h"]

[].reduce.call("some string", function(a, b){ 
    return (+a === a ? a : a.charCodeAt(0)) + b.charCodeAt(0);
})
// 1131

[].filter.call("some string", function(x){ 
    return x.charCodeAt(0) > 110; 
})
// ["s", "o", "s", "t", "r"]
2个回答

7

字符串是不可变的。你实际上不能改变一个字符串;特别地,Array.prototype.sort 会修改一个字符串以进行排序,所以你不能这样做。你只能创建一个新的、不同的字符串。

x = 'dcba';
// Create a character array from the string, sort that, then
// stick it back together.
y = x.split('').sort().join('');

1
有道理!我之前一直在使用分割 -> 排序 -> 合并的方法,但现在只是想找到一个更短的代码高尔夫方法。 - nderscore

3
因为字符串是不可变的。
你提到的这些函数会返回一个新的对象,它们不会直接更新原字符串。
当然,也可以通过一些间接的方法对字符串进行排序:
var sorted = "some string".split("").sort().join("");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接