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"]
4

2 回答 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('');
于 2013-07-29T02:11:32.473 回答
3

因为字符串是不可变的。

您提到的工作函数返回一个新对象,它们不会就地更新字符串。

当然,不那么直接地对字符串进行排序很容易:

var sorted = "some string".split("").sort().join("");
于 2013-07-29T02:13:02.603 回答