[]
это массив.
Этот массив вообще не используется.
Он размещается на странице, потому что использование массива дает вам доступ к прототипам массива, например .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
.
Итак, как нам справиться с неравенством, ведь Девиз явно талантливый и знающий парень, и я хотел бы представить, что я знаю, что делаю / куда иду (время от времени ... ... другое раз это обучение с головы до ног)?
Ответ на самом деле довольно прост, и что-то, что дядя Боб и сэр Крокфорд могли бы потерять лицо из-за недосмотра:
убери это .
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) и последующих версий
Вспомогательный метод slice( )
/ array( )
/ etc не только упростит жизнь людям, которые хотят использовать списки точно так же, как они используют массивы (как они должны), но и тем людям, которые могут позволить себе роскошь работать в браузерах ES6 + относительно близких future, или «транспиляции» в 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 ];
Супер-чисто и очень полезно.
Найдите операторы Rest и Spread ; опробуйте их на сайте BabelJS; если ваш стек технологий в порядке, используйте их в производстве с помощью Babel и этапа сборки.
Нет веской причины не использовать преобразование из не массива в массив ... ... просто не путайте свой код, ничего не делая, кроме вставки той же уродливой строки повсюду.