Ответ 1
[]
- массив.
Этот массив не используется вообще.
Он помещается на страницу, потому что использование массива дает вам доступ к прототипам массива, например .forEach
.
Это происходит быстрее, чем набирать Array.prototype.forEach.call(...);
Далее, forEach
- это функция, которая принимает функцию как вход...
[1,2,3].forEach(function (num) { console.log(num); });
... и для каждого элемента в this
(где this
является массивным, поскольку он имеет length
, и вы можете получить доступ к его частям, например, this[1]
), он будет передавать три вещи:
- элемент в массиве
- индекс элемента (третий элемент пройдет
2
) - ссылка на массив
Наконец, .call
является прототипом, функции которого имеют (это функция, вызываемая на другие функции). .call
примет свой первый аргумент и заменит this
внутри регулярной функции тем, что вы передали call
, поскольку первый аргумент (undefined
или null
будет использовать window
в повседневной JS или будет независимо от того, что вы прошли, если в "строгом режиме" ). Остальные аргументы будут переданы исходной функции.
[1, 2, 3].forEach.call(["a", "b", "c"], function (item, i, arr) {
console.log(i + ": " + item);
});
// 0: "a"
// 1: "b"
// 2: "c"
Следовательно, вы создаете быстрый способ вызвать функцию forEach
, и вы меняете this
из пустого массива на список всех тегов <a>
и для каждого <a>
порядок, вы вызываете предоставленную функцию.
ИЗМЕНИТЬ
Логическое заключение/очистка
Ниже приведена ссылка на статью, в которой говорится, что мы отказываемся от попыток функционального программирования и каждый раз придерживаемся ручного, встроенного цикла, потому что это решение является хакером и неприглядным.
Я бы сказал, что хотя .forEach
менее полезен, чем его аналоги, .map(transformer)
, .filter(predicate)
, .reduce(combiner, initialValue)
, он по-прежнему служит целям, когда все, что вы действительно хотите сделать, это изменить внешний мир (не массив), n раз, имея доступ к arr[i]
или i
.
Итак, как мы имеем дело с несоответствием, поскольку Девиз явно талантливый и знающий парень, и я хотел бы представить, что я знаю, что я делаю/куда я иду (время от времени...... в других случаях это начальное обучение)?
Ответ на самом деле довольно прост, и что-то дядя Боб и сэр Крокфорд будут оба facepalm, из-за недосмотра:
очистить его.
function toArray (arrLike) { // or asArray(), or array(), or *whatever*
return [].slice.call(arrLike);
}
var checked = toArray(checkboxes).filter(isChecked);
checked.forEach(listValues);
Теперь, если вы задаетесь вопросом, нужно ли вам это делать, самому себе, ответ вполне может быть...
Эта точная вещь выполняется...... каждой (?) Библиотекой с функциями более высокого порядка в эти дни.
Если вы используете lodash или подчеркивание или даже jQuery, все они будут иметь способ взять набор элементов и выполнить действие n раз.
Если вы не используете такую вещь, тогда, во что бы то ни стало, напишите свой собственный.
lib.array = (arrLike, start, end) => [].slice.call(arrLike, start, end);
lib.extend = function (subject) {
var others = lib.array(arguments, 1);
return others.reduce(appendKeys, subject);
};
Обновление для ES6 (ES2015) и Beyond
Не только вспомогательный метод slice( )
/array( )
/etc поможет сделать жизнь проще для людей, которые хотят использовать списки, так же как они используют массивы (как должны), но для людей, у которых есть роскошь работая в браузерах ES6 + относительно недалекого будущего или "перетаскивая" в Babel сегодня, у вас есть встроенные языковые функции, которые делают этот тип вещей ненужным.
function countArgs (...allArgs) {
return allArgs.length;
}
function logArgs (...allArgs) {
return allArgs.forEach(arg => console.log(arg));
}
function extend (subject, ...others) { /* return ... */ }
var nodeArray = [ ...nodeList1, ...nodeList2 ];
Супер-чистый, и очень полезный.
Найдите операторы Отдых и Spread; попробуйте их на сайте BabelJS; если ваш технический стек в порядке, используйте их в производстве с Babel и шаг сборки.
Нет никакой веской причины, чтобы не использовать преобразование из не-массива в массив...... просто не делайте беспорядок своего кода, ничего не делая, кроме вставки этой же уродливой линии, везде.