Функция массива Javascript?

#javascript

#javascript

Вопрос:

я копался в инфраструктуре библиотеки jquery Sizzle и увидел этот фрагмент кода

 [0, 0].sort(function() {
    baseHasDuplicate = false;
    return 0;
});
  

на ум пришло несколько вопросов :

  1. как вызвать эту функцию
  2. в чем преимущества написания такой функции
  3. почему это уникальный стиль написания?
  4. разве между «сортировкой» и «функцией» не должно быть «=»?

помимо ответов, статья или учебное пособие об этом материале было бы здорово.

Комментарии:

1. вы имеете в виду sort() или анонимную функцию?

2. нет, под «функцией», какую вы имеете в виду? Функция сортировки или аргумент? Я не могу сказать, какая из них вас интересует … поскольку они являются обеими функциями 🙂

3. Я предлагаю вам купить книгу о Javascript (например: «Шаблоны Javascript», Если вы знаете другие языки (C и т. Д.) И хотите изучать JS).

Ответ №1:

Сначала я понял большую часть кода, но не весь. Сокращение массива и анонимная функция были мне знакомы, но я ожидаю, что функция sortFunction будет принимать два аргумента, тогда как этот аргумент не принимает ни одного. Из-за этого я не понимал, зачем вы это делаете: чего надеялся достичь код.

К счастью, поиск в Google решил это для меня. Вы можете найти код на сайте jsPerf и просмотреть исходную функцию из вопроса, показанного с контекстом по этой ссылке:

http://jsperf.com/jquery-1-4-3-perf-degrade/4

Теперь мы также можем видеть комментарии к коду:

 // Here we check if the JavaScript engine is using some sort of
// optimization where it does not always call our comparision
// function. If that is the case, discard the hasDuplicate value.
//   Thus far that includes Google Chrome.
[0, 0].sort(function() {
  baseHasDuplicate = false;
  return 0;
});
  

Если вы знакомы с тем, как работают функции сортировки, теперь это имеет смысл. При сортировке последовательности алгоритму сортировки необходимо часто сравнивать два элемента из последовательности, чтобы знать, какой из них сортировать раньше другого. Чтобы вы могли настраивать сортировку, такие функции часто позволяют передавать другую функцию в качестве аргумента, и задача этой функции — решить, как элементы сравниваются друг с другом.

В этом случае у нас есть небольшой массив, который уже отсортирован. Любой разумный алгоритм сортировки должен вызывать эту функцию ровно один раз, а затем завершать ее. Однако компилятор javascript может попытаться оптимизировать функцию сравнения при определенных обстоятельствах, чтобы она не вызывалась. Таким образом, цель этого кода — определить, когда это происходит. Перед вызовом функции вы сначала устанавливаете baseHasDuplicate значение true. Затем вы запускаете этот код, а затем проверяете, изменился ли baseHasDuplicate.

Ответ №2:

Array.sort Принимает функцию в качестве аргумента. Функция отвечает за сравнение элементов массива и возвращает правильный результат для их фактической сортировки. Таким образом, вы бы не вызывали передаваемую функцию для сортировки напрямую.

Ответ №3:

Вы вызываете Array.sort() функцию, которая принимает параметр — функцию, которая сравнивает два элемента. Как вы можете прочитать в документах, функция должна возвращать false или true .

Теперь аргумент, который является анонимной функцией, а также замыканием. Вы не можете вызвать ее напрямую, поскольку вы не сохраняете ее ссылку.

Это не [0, 0].sort = function(){} так, поскольку вы передаете функцию в качестве параметра, так что это означает, что функция сортировки будет использовать вашу функцию annon где-то внутри. Если бы вы назначили ее (используя = ), вы бы изменили саму sort функцию.

Комментарии:

1. функции сортировки не должны возвращать false или true — существует три состояния: меньше, больше и равно. Игнорирование третьего состояния может вызвать проблемы.