Когда вы даете sort
функцию (называется компаратор) sort
не делает никаких предположений относительно значений (или преобразовать их к чему-либо) вообще. Он просто вызывает функцию, которую вы даете ей повторно, чтобы сравнить пары элементов (назовите их и b
) и использует возвращаемое значение функции, чтобы определить, как упорядочить эти два элемента в результате: если это 0
, a
и b
равны; если он положительный, b
должен наступить после a
(например, b
«больше чем» a
); если он отрицательный, b
должны прийти до a
(например, b
«меньше, чем a
). Таким образом, путем вычитания a
из b
, то sortLowToHigh
возвращает соответствующие значения.
Поведение новообращенного к строке вы упоминаете применяется только тогда, когда вы не дают sort
компаратор использовать.
Это накрыты (в напыщенной прозе) по §15.4.4.11 из спецификации.
Порядок вызовов на компаратор полностью вплоть до реализации, а различные реализации могут использовать разные алгоритмы сортировки, поэтому некоторые механизмы JavaScript могут вызывать компаратор больше или меньше или в другом порядке по сравнению с другими. Например, с учетом этого:
var v = [30,2,1,9,15];
v.sort(function(a, b) {
snippet.log("a = " + a + ", b = " + b);
});
snippet.log(v.join(", "));
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
Текущая версия выходов Chrome:
a = 30, b = 2
a = 2, b = 1
a = 1, b = 9
a = 9, b = 15
30, 2, 1, 9, 15
...но текущая версия Firefox выходов
a = 30, b = 2
a = 2, b = 1
a = 9, b = 15
a = 1, b = 9
30, 2, 1, 9, 15
Они оба получить тот же результат, конечно же, или один из них будет нарушать спецификации, но это забавно видеть, что порядок вызовов действительно меняется.