[]jest tablicą.
Ta tablica nie jest w ogóle używana.
Jest umieszczany na stronie, ponieważ użycie tablicy daje dostęp do prototypów tablic, takich jak .forEach.
To jest po prostu szybsze niż pisanie Array.prototype.forEach.call(...);
Następnie forEachjest to funkcja, która przyjmuje funkcję jako dane wejściowe ...
[1,2,3].forEach(function (num) { console.log(num); });
... i dla każdego elementu w this(gdzie thisjest podobny do tablicy, w tym, że ma lengthi możesz uzyskać dostęp do jego części jak this[1]), przekaże trzy rzeczy:
- element w tablicy
- indeks elementu (przeszedłby trzeci element
2)
- odniesienie do tablicy
Na koniec .calljest prototypem, który mają funkcje (jest to funkcja wywoływana przez inne funkcje).
.callweźmie swój pierwszy argument i zastąpi thiswewnątrz zwykłej funkcji tym, co przekazałeś call, jako pierwszy argument ( undefinedlub nullbędzie użyty windoww codziennym JS, lub będzie tym, co przekazałeś, jeśli w "trybie ścisłym"). Reszta argumentów zostanie przekazana do oryginalnej funkcji.
[1, 2, 3].forEach.call(["a", "b", "c"], function (item, i, arr) {
console.log(i + ": " + item);
});
Dlatego tworzysz szybki sposób wywołania forEachfunkcji i zmieniasz thispustą tablicę na listę wszystkich <a>tagów, a dla każdego <a>w kolejności wywołujesz podaną funkcję.
EDYTOWAĆ
Logiczne wnioski / czyszczenie
Poniżej znajduje się link do artykułu sugerującego, że za każdym razem rezygnujemy z prób programowania funkcjonalnego i trzymamy się ręcznego, wbudowanego zapętlania, ponieważ to rozwiązanie jest hakerskie i brzydkie.
Powiedziałbym, że choć .forEachjest mniej przydatne niż jego odpowiedniki, .map(transformer), .filter(predicate), .reduce(combiner, initialValue), to nadal służy celom kiedy wszystko, co naprawdę chcesz robić to zmieniać świat na zewnątrz (nie array), n-razy, mając jednocześnie dostęp do jednej arr[i]lub i.
Jak więc sobie radzić z rozbieżnością, skoro Motto jest wyraźnie utalentowanym i kompetentnym facetem, i chciałbym sobie wyobrazić, że wiem, co robię / dokąd zmierzam (od czasu do czasu ... ... inne razy jest to uczenie się w pierwszej kolejności)?
Odpowiedź jest w rzeczywistości dość prosta i coś, co wujek Bob i Sir Crockford obaj spojrzeliby na siebie z powodu przeoczenia:
posprzątaj to .
function toArray (arrLike) {
return [].slice.call(arrLike);
}
var checked = toArray(checkboxes).filter(isChecked);
checked.forEach(listValues);
Jeśli zastanawiasz się, czy sam musisz to zrobić, odpowiedź może brzmieć nie ...
Dokładnie to robi ... ... każda (?) Biblioteka z funkcjami wyższego rzędu.
Jeśli używasz lodash lub podkreślenia, a nawet jQuery, wszyscy będą mieli sposób na pobranie zestawu elementów i wykonanie akcji n-krotnie.
Jeśli nie używasz czegoś takiego, to jak najbardziej napisz własną.
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);
};
Aktualizacja dla ES6 (ES2015) i nie tylko
Metoda pomocnicza slice( )/ array( )/ etc ułatwi życie nie tylko ludziom, którzy chcą używać list tak samo, jak używają tablic (tak jak powinni), ale także osobom, które mają luksus pracy w przeglądarkach ES6 + o stosunkowo bliskiej przyszłości lub „transpilacji” w Babel dzisiaj, masz wbudowane funkcje językowe, które sprawiają, że tego typu rzeczy są niepotrzebne.
function countArgs (...allArgs) {
return allArgs.length;
}
function logArgs (...allArgs) {
return allArgs.forEach(arg => console.log(arg));
}
function extend (subject, ...others) { }
var nodeArray = [ ...nodeList1, ...nodeList2 ];
Super czysty i bardzo przydatny.
Wyszukaj operatory Rest i Spread ; wypróbuj je w witrynie BabelJS; jeśli twój stos technologiczny jest w porządku, użyj go w produkcji z Babel i krokiem budowy.
Nie ma dobrego powodu, aby nie być w stanie korzystać z transformacji z braku tablicy do tablicy ... ... tylko nie rób bałaganu kodzie nic nie robi , ale wklejając że sam brzydki linii, wszędzie.