Разница между `_.forEach` и` $.each` - программирование
Подтвердить что ты не робот

Разница между `_.forEach` и` $.each`

Эти две функции, _.forEach и $.each, взятые соответственно из underscore и jQuery, похоже, делают одно и то же.

Каковы возможные причины предпочесть одну реализацию другому?

4b9b3361

Ответ 1

_.forEach и $.each отличается для аргументов, переданных обратному вызову.

Если вы используете _.forEach, первым аргументом, переданным обратному вызову, является значение, а не ключ.
Поэтому, если вы вообще не беспокоитесь о ключе, вы должны использовать _.forEach.

Другие отличия:

  • _.forEach он будет немного быстрее, так как он использует собственный Arrray.prototype.forEach в современных браузерах.
  • это значение также отличается. Поведение jQuery не соответствует стандарту, подчеркивание делает.

Ответ 2

Оба они в основном обеспечивают замену функции forEach, которая недоступна в IE8.

Они не добавляют много, если вы повторяете массивы.

Основное отличие, помимо порядка аргументов обратного вызова, заключается в том, что в jQuery значение также доступно как контекст вызова обратного вызова (поэтому значение, менее важно, является только вторым аргументом). На самом деле это не главная причина, чтобы предпочесть его, если вам не нравится избегать передачи аргумента функции:

var product = 1;
$.each([1, 2, 3], function(){ product *= this });

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

Если вам нужно импортировать обе библиотеки, я бы предложил использовать функцию подчеркивания как

  • он наиболее похож на стандартную функцию ECMAScript на массивах, поэтому вы сможете легко переносить день, когда IE8 будет мертв
  • он более эффективен, так как он использует встроенную функцию, когда он доступен:

См. источник:

...
if (nativeForEach && obj.forEach === nativeForEach) {
     obj.forEach(iterator, context);
...

Ответ 3

jQuery выглядит следующим образом:

something.each( function(index, Element) )

Подчеркивание выглядит следующим образом:

_.each(list, function(Element, index, list), [context])
// or
_(list).each(function(Element, index, list), [context])

Нативный массив. для каждого выглядит следующим образом:

array.forEach(function(Element, index, list), [context])

Итак:

  • Подчеркивание сохраняет тот же порядок аргументов, что и native forEach
  • Существуют две отличия между реализацией JQuery и Underscore:
    • JQuery устанавливает this в Element, native и Underscore позволяют вам предоставлять свой собственный контекст.
    • Native и underscore также предоставляют список как третий аргумент для обратного вызова.

Изменить: Почему полезно устанавливать контекст?

Учтите, что у вас есть какой-то объект:

var worker = new FooWorker();
worker.process(something);
worker.process(somethingElse);

Предположим, вы хотите вызвать этот метод для каждого значения из массива.
Используя параметр контекста, вы можете просто сказать:

myArray.forEach(worker.process, worker);

в то время как без него вам нужно быть более подробным (и сделать еще один вызов функции для каждого элемента):

// native
myArray.forEach( function(i, e) {worker.process(e);} );
// jquery
$(myArray).each( function() {worker.process(this); } );

Это одна из ситуаций, когда соглашение JQuery foreaching делает вещи менее удобными.