[]
ist ein Array.
Dieses Array wird überhaupt nicht verwendet.
Es wird auf die Seite gestellt, da Sie durch die Verwendung eines Arrays Zugriff auf Array-Prototypen wie z .forEach
.
Dies ist nur schneller als das Tippen Array.prototype.forEach.call(...);
Als nächstes forEach
ist eine Funktion, die eine Funktion als Eingabe nimmt ...
[1,2,3].forEach(function (num) { console.log(num); });
... und für jedes Element in this
(wo this
es Array-ähnlich ist, indem es ein hat length
und Sie auf seine Teile wie zugreifen können this[1]
) werden drei Dinge übergeben:
- das Element im Array
- der Index des Elements (drittes Element würde passieren
2
)
- ein Verweis auf das Array
Schließlich .call
ist ein Prototyp, den Funktionen haben (es ist eine Funktion, die für andere Funktionen aufgerufen wird).
.call
nimmt das erste Argument und ersetzt es this
innerhalb der regulären Funktion durch das, was Sie call
als erstes Argument übergeben haben ( undefined
oder null
wird window
im alltäglichen JS verwendet oder ist das, was Sie übergeben haben, wenn es sich im "strengen Modus" befindet). Die restlichen Argumente werden an die ursprüngliche Funktion übergeben.
[1, 2, 3].forEach.call(["a", "b", "c"], function (item, i, arr) {
console.log(i + ": " + item);
});
// 0: "a"
// 1: "b"
// 2: "c"
Daher erstellen Sie eine schnelle Möglichkeit, die forEach
Funktion aufzurufen , und wechseln this
vom leeren Array zu einer Liste aller <a>
Tags. Für jede <a>
Reihenfolge rufen Sie die bereitgestellte Funktion auf.
BEARBEITEN
Logische Schlussfolgerung / Bereinigung
Unten finden Sie einen Link zu einem Artikel, der darauf hinweist, dass wir Versuche der funktionalen Programmierung abschaffen und uns jedes Mal an manuelle Inline-Schleifen halten, da diese Lösung hackig und unansehnlich ist.
Ich würde sagen , dass , während .forEach
weniger hilfreich als seine Kollegen, .map(transformer)
, .filter(predicate)
, .reduce(combiner, initialValue)
, es dient immer noch Zwecke , wenn alles , was Sie wirklich wollen , ist die Außenwelt ändern (nicht das Array), n-mal, während Zugang zu entweder arr[i]
oder i
.
Wie gehen wir mit der Ungleichheit um, da Motto eindeutig ein talentierter und sachkundiger Typ ist und ich mir vorstellen möchte, dass ich weiß, was ich tue / wohin ich gehe (ab und zu ... ... andere) Mal ist es Head-First-Lernen)?
Die Antwort ist eigentlich recht einfach, und Onkel Bob und Sir Crockford würden aufgrund des Versehens beide Gesichtspalmen:
räum es auf .
function toArray (arrLike) { // or asArray(), or array(), or *whatever*
return [].slice.call(arrLike);
}
var checked = toArray(checkboxes).filter(isChecked);
checked.forEach(listValues);
Wenn Sie sich jetzt fragen, ob Sie dies selbst
tun müssen, lautet die Antwort möglicherweise nein ... Genau das erledigt heutzutage ... ... jede (?) Bibliothek mit Funktionen höherer Ordnung.
Wenn Sie lodash oder Unterstrich oder sogar jQuery verwenden, haben alle die Möglichkeit, eine Reihe von Elementen zu übernehmen und eine Aktion n-mal auszuführen.
Wenn Sie so etwas nicht verwenden, schreiben Sie auf jeden Fall Ihre eigenen.
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);
};
Update für ES6 (ES2015) und darüber hinaus
Eine slice( )
/ array( )
/ etc-Hilfsmethode wird nicht nur Menschen das Leben erleichtern, die Listen genauso verwenden möchten, wie sie Arrays verwenden (wie sie sollten), sondern auch Menschen, die den Luxus haben, in ES6 + -Browsern der relativ nahen Umgebung zu arbeiten Zukunft oder von "Transpilieren" in Babel heute haben Sie Sprachfunktionen eingebaut, die diese Art von Dingen unnötig machen.
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 ];
Super sauber und sehr nützlich.
Suchen Sie nach den Operatoren Rest und Spread . Probieren Sie sie auf der BabelJS-Website aus. Wenn Ihr Tech-Stack in Ordnung ist, verwenden Sie ihn in der Produktion mit Babel und einem Build-Schritt.
Es gibt keinen guten Grund , nicht in der Lage sein , die aus Nicht-Array in einem Array umwandeln zu verwenden ... ... macht nicht nur ein Durcheinander von Code nichts zu tun , aber der gleichen hässlicher Linie einfügen, überall.