Ich weiß, dass es verwendet wird, um arguments
eine echte Array
aber ich verstehe nicht, was passiert, wenn ich Array.prototype.slice.call(arguments);
.
Antworten
Zu viele Anzeigen?// We can apply `slice` from `Array.prototype`:
Array.prototype.slice.call([]); //-> []
// Since `slice` is available on an array's prototype chain,
'slice' in []; //-> true
[].slice === Array.prototype.slice; //-> true
// … we can just invoke it directly:
[].slice(); //-> []
// `arguments` has no `slice` method
'slice' in arguments; //-> false
// … but we can apply it the same way:
Array.prototype.slice.call(arguments); //-> […]
// In fact, though `slice` belongs to `Array.prototype`,
// it can operate on any array-like object:
Array.prototype.slice.call({0: 1, length: 1}); //-> [1]
Denn als MDN-Notizen
Das Argumente-Objekt ist kein Array. Es ist ähnlich wie ein Array, aber hat keine Array-Eigenschaften außer der Länge. Zum Beispiel hat es nicht über die pop-Methode. Es kann jedoch in ein echtes Array konvertiert werden:
Hier rufen wir slice
auf das einheimische Objekt Array
und nicht auf seine Umsetzung und deshalb ist die zusätzliche .prototype
var args = Array.prototype.slice.call(arguments);
Vergessen Sie nicht, dass eine Low-Level-Grundlage für dieses Verhalten ist die Art-Casting, die in JS-Engine vollständig integriert.
Slice nimmt einfach ein Objekt (dank der vorhandenen arguments.length-Eigenschaft) und gibt ein Array-Objekt zurück, nachdem alle Operationen darauf ausgeführt wurden.
Die gleiche Logik können Sie testen, wenn Sie versuchen, die String-Methode mit einem INT-Wert zu behandeln:
String.prototype.bold.call(11); // returns "<b>11</b>"
Und das erklärt die obige Aussage.
Es verwendet die slice
Methode Arrays haben und ruft sie mit ihrer this
wobei die arguments
Objekt. Das heißt, es wird so aufgerufen, als ob Sie arguments.slice()
unter der Annahme, dass arguments
hatte eine solche Methode.
Wenn Sie ein Slice ohne Argumente erstellen, werden einfach alle Elemente übernommen - es werden also einfach die Elemente aus arguments
zu einem Array.