[]
- це масив.
Цей масив взагалі не використовується.
Це розміщується на сторінці, оскільки використання масиву надає вам доступ до прототипів масиву, наприклад .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 та кроком складання.
Немає жодних вагомих причин не в змозі використовувати перетворення з не-масиву в масив ... просто не зробляйте безладу свого коду, нічого не роблячи, окрім того, щоб скрізь вставляти ту саму потворну лінію.