[]- це масив.
Цей масив взагалі не використовується.
Це розміщується на сторінці, оскільки використання масиву надає вам доступ до прототипів масиву, наприклад .forEach.
Це просто швидше, ніж набирати текст Array.prototype.forEach.call(...);
Далі, forEachце функція, яка приймає функцію як вхід ...
[1,2,3].forEach(function (num) { console.log(num); });
... і для кожного елемента в this(де thisвін схожий на масив, оскільки він має a, 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>замовлення ви викликаєте надану функцію.
EDIT
Логічний висновок / очищення
Нижче наводиться посилання на статтю, яка передбачає, що ми робимо спроби функціонального програмування і кожен раз дотримуємось ручного, вбудованого циклу, оскільки це рішення є хакерським і непривабливим.
Я б сказав , що в той час як .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 + браузерах порівняно-близько Майбутнє або "перенесення" в Вавилон сьогодні, ви маєте вбудовані мовні функції, які роблять цей предмет непотрібним.
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 ];
Супер чистий і дуже корисний.
Знайдіть операторів відпочинку та розповсюдження ; спробуйте їх на сайті BabelJS; якщо у вас є технологічний стек, використовуйте їх у виробництві з Babel та кроком складання.
Немає жодних вагомих причин не в змозі використовувати перетворення з не-масиву в масив ... просто не зробляйте безладу свого коду, нічого не роблячи, окрім того, щоб скрізь вставляти ту саму потворну лінію.