[]
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 forEach
jest 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 this
jest podobny do tablicy, w tym, że ma length
i 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 .call
jest prototypem, który mają funkcje (jest to funkcja wywoływana przez inne funkcje).
.call
weźmie swój pierwszy argument i zastąpi this
wewnątrz zwykłej funkcji tym, co przekazałeś call
, jako pierwszy argument ( undefined
lub null
będzie użyty window
w 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 forEach
funkcji i zmieniasz this
pustą 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ć .forEach
jest 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.