2013-07-29 27 views
4

有誰知道爲什麼在一個字符串上調用Array.sort是非法的嗎?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"] 

回答

6

字符串是不可變的。你實際上不能改變一個字符串;特別是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

有道理!我一直在使用split - > sort - > join,但只是想爲代碼高爾夫尋找一個更短的方法 – nderscore

3

因爲字符串是不可變的。

您提到該作品的功能會返回一個新對象,但它們不會更新該字符串。

當然很容易梳理串少一點直接:

var sorted = "some string".split("").sort().join("");