这个排序函数内部的机制是什么

what is the mechanism going on inside this sort function

我已经了解了这个 article 关于 Array.prototype.sort() 的内容。Sort() 函数可以根据使用 UNICODE [=20] 进行排序的 compareFunction.For 字符串的可用性而表现不同=] 在这个特定的例子中,一个数组包含两个不同的元素,它们具有 相同的前三个字母 。我的问题是 compareFunction 如何决定先进入哪个元素像这样的情况??

var numbers = ['Hammer',"Hamburger"];
numbers.sort(function(a, b) {
  return a - b;
});
console.log(numbers); //['Hammer','Hamburger']

我认为您遇到了问题,因为在 compareFunction 中您说的是

a-b; 

记住 "str1"-"str2" 会 return 一个 NaN。所以你不会得到预期的结果。

如果你想按升序排序,请像下面这样说

a>b;

a.localeCompare(b);

完整代码

var numbers = ['Hammer',"Hamburger"];
numbers.sort(function(a, b) {
  return a.localeCompare(b);
});
console.log(numbers); //["Hamburger", "Hammer"]

此方法不适用于字符串值

To compare numbers instead of strings, the compare function can simply subtract b from a:

function compareNumbers(a, b) {
    return a - b;
}

也就是说,这应该只用于数字而不适用于字符串。

对非 ASCII 字符进行排序

"For sorting strings with non-ASCII characters, i.e. strings with accented characters (e, é, è, a, ä, etc.), strings from languages other than English: use String.localeCompare. This function can compare those characters so they appear in the right order.:"

var items = ['réservé', 'premier', 'cliché', 'communiqué', 'café', 'adieu'];
items.sort(function (a, b) {
     return a.localeCompare(b);
});
// items is ['adieu', 'café', 'cliché', 'communiqué', 'premier', 'réservé']

否则,只需使用普通的 .sort() 并且不要担心实现,除非它对您来说很奇怪

var fruit = ['apples', 'bananas', 'Cherries'];
fruit.sort(); // ['Cherries', 'apples', 'bananas'];

.sort(function(){}) 行为如下(returned 变量将被称为 result):

1) result < 0 - 第二个元素比第一个大;

2) result = 0 - 第二个元素等于第一个元素;

3) result > 0 - 第二个元素小于第一个元素;

所以这个算法只适用于数字,当比较字符串时,"str1" - "str2"会returnNaN

你可以用字符串数组这样做:

function compareString(a, b)
{
       var lowera = a.toLowerCase();
         var lowerb = b.toLowerCase();
         if (lowera < lowerb){
            return -1;
         }else if (lowera > lowerb){
           return  1;
         }else{
           return 0;
         }
}

var numbers = ['Hammer',"Hamburger"];
numbers.sort(compareString);
console.log(numbers); //['Hamburger','Hammer']