Wie funktioniert Array.prototype.slice.call ()?
Ich weiß, es wird verwendet, um Argumente, die ein real-array, aber ich verstehe nicht, was passiert, wenn Array.prototype.slice.call(arguments)
InformationsquelleAutor der Frage ilyo | 2011-08-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Was passiert unter der Haube ist, dass, wenn
.slice()
heißt normalerweisethis
ist ein Array, und dann ist es nur iteriert über das Array und tut seine Arbeit.Wie ist
this
im.slice()
Funktion ein Array? Denn wenn Sie das tun:...die
object
wird automatisch der Wert derthis
immethod()
. So mit:...die
[1,2,3]
Array ist als der Wert derthis
im.slice()
.Aber was ist, wenn Sie ersetzen könnte, etwas anderes als die
this
Wert? Solange alles, was Sie ersetzen einen numerischen.length
- Eigenschaft, und eine Reihe von Eigenschaften, die numerische Indizes, sollte es funktionieren. Diese Art von Objekten wird oft als eine array-artiges Objekt.Den
.call()
und.apply()
Methoden lassen Sie manuell setzen Sie den Wertthis
in einer Funktion. Wenn wir also den Wert desthis
im.slice()
zu einem array-artiges Objekt.slice()
wird nur übernehmen es arbeitet mit einem Array und seine Sache tun.Nehmen Sie diese plain-Objekt als Beispiel.
Dies ist natürlich nicht ein Array, sondern, wenn Sie können legen Sie es als
this
Wert von.slice()
dann wird es nur funktionieren, weil es aussieht wie genug ein Array für.slice()
um richtig zu arbeiten.Beispiel: http://jsfiddle.net/wSvkv/
Wie Sie sehen können, in der Konsole, das Ergebnis ist das, was wir erwarten:
Also das ist, was passiert, wenn du eine
arguments
Objekt alsthis
Wert von.slice()
. Daarguments
hat eine.length
Eigenschaft und eine Reihe von numerischen Indizes, die.slice()
geht nur über seine Arbeit, als wäre es die Arbeit auf einem echten Array.InformationsquelleAutor der Antwort user113716
Den
arguments
Objekt ist nicht wirklich eine Instanz des Array, und nicht über alle Array-Methoden. Alsoarguments.slice(...)
wird nicht funktionieren, weil das arguments-Objekt nicht über die slice-Methode.Arrays zu tun haben, dieser Methode und weil der
arguments
Objekt ist sehr ähnlich zu einem array, die beiden sind kompatibel. Dies bedeutet, dass wir verwenden können array-Methoden mit dem arguments-Objekt. Und da die array-Methoden wurden gebaut, mit arrays im Geist, werden Sie zurückkehren-arrays eher als andere argument-Objekte.Warum also
Array.prototype
? DieArray
ist das Objekt, das wir erstellen neue Felder aus (new Array()
), und diese neuen arrays übergeben werden Methoden und Eigenschaften, wie Scheibe. Diese Methoden befinden sich in der[Class].prototype
Objekt. So, für Effizienz Willen, statt den Zugriff auf die slice-Methode durch(new Array()).slice.call()
oder[].slice.call()
wir nur bekommen es direkt aus dem Prototyp. Dies ist, so haben wir nicht zu initialisieren, wird ein neues array.Aber warum müssen wir dies tun in den ersten Platz? Naja, wie du schon sagtest, es wandelt ein arguments-Objekt in ein Array-Instanz. Der Grund, warum wir verwenden Scheibe, jedoch, ist mehr ein "hack", als alles andere. Die slice-Methode nehmen, Sie Ahnen es, die Scheibe einem array und zurück, die Scheibe, als ein neues array. Ohne dass Argumente übergeben werden, um es (neben dem arguments-Objekt als Kontext) bewirkt, dass die slice-Methode, um ein komplettes Stück bestanden "array" (in diesem Fall das arguments-Objekt) und schicken Sie es als ein neues array.
InformationsquelleAutor der Antwort Ben Fleming
Normalerweise Aufruf
kopiert das array
a
inb
. Allerdings können wir nichtweil
arguments
ist kein echtes array, und nichtslice
als eine Methode.Array.prototype.slice
ist dieslice
- Funktion für arrays undcall
läuft die Funktion mitthis
eingestelltarguments
.InformationsquelleAutor der Antwort Delan Azabani
InformationsquelleAutor der Antwort sam
Ersten, die Sie Lesen sollten,wie dem Funktions-Aufruf funktioniert in JavaScript. Ich vermute, dass allein ist genug, um Ihre Frage zu beantworten. Aber hier ist eine Zusammenfassung von dem, was passiert ist:
Array.prototype.slice
extrahiert dieslice
Methode vonArray
's Prototyp. Aber ruft es direkt nicht funktioniert, da es eine Methode (keine Funktion) und erfordert daher ein Kontext (ein Aufruf-Objektthis
), sonst würde es werfenUncaught TypeError: Array.prototype.slice called on null or undefined
.Den
call()
- Methode können Sie angeben, eine Methode, den Kontext, im Grunde macht diese beiden Aufrufe äquivalent:Ausnahme der ehemaligen erfordert die
slice
Methode bestehen insomeObject
's Prototyp-Kette (Array
), während die letzteren erlaubt, den Kontext (someObject
) manuell an die Methode übergeben.Auch, letzteres ist die Abkürzung für:
Das ist das gleiche wie:
InformationsquelleAutor der Antwort Marco Roy
Sein, weil, wie MDN-Noten
Hier fordern wir
slice
auf das systemeigene ObjektArray
und nicht auf seine Umsetzung und das ist, warum die extra.prototype
InformationsquelleAutor der Antwort naveen
Array.der Prototyp.Scheibe.call(arguments) ist der altmodische Weg, um konvertieren von Argumenten in einem array.
In ECMAScript 2015, Sie können Arrays verwendet werden.aus oder der spread-operator:
InformationsquelleAutor der Antwort Alexander Moiseyev
Vergessen Sie nicht, dass ein low-level-Grundlagen dieses Verhaltens ist das type-casting, integriert in der JS-engine völlig.
Scheibe dauert nur Objekt (Dank der vorhandenen Argumente.length-Eigenschaft) und gibt die array-Objekt gecastet tun, nachdem alle Operationen auf, die.
Der gleichen Logik können Sie prüfen, wenn Sie versuchen zur Behandlung von String-Methode mit einem INT-Wert:
Und erklärt, dass obige Erklärung.
InformationsquelleAutor der Antwort Andrey
Es nutzt die
slice
Methode arrays haben, und fordert es mit seinenthis
diearguments
Objekt. Dies bedeutet, er nennt es, als ob Sie gararguments.slice()
vorausgesetztarguments
hatte eine solche Methode.Erstellen eine Scheibe ohne jegliche Argumente nimmt einfach alle Elemente - so ist es einfach Kopien der Elemente aus
arguments
zu einem array.InformationsquelleAutor der Antwort ThiefMaster
Nehmen wir an, Sie haben:
function.apply(thisArg, argArray )
Die slice () - Methode wählt ein Teil aus einem array und gibt das neue array.
Also, wenn Sie rufen
Array.prototype.slice.apply(arguments, [0])
der array-slice-Methode aufgerufen wird (bind) auf die Argumente.InformationsquelleAutor der Antwort user278064
Vielleicht ein bisschen spät, aber die Antwort auf diese Misere ist, dass die call() wird verwendet, JS für die Vererbung.
Wenn wir es vergleichen mit Python oder PHP, zum Beispiel, rufen verwendet wird, bzw. als "super" ().init() oder parent::_construct().
Dies ist ein Beispiel, das verdeutlicht alles:
Referenz: https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/Inheritance
InformationsquelleAutor der Antwort Davide Pugliese
wenn .slice() aufgerufen wird, normalerweise ist dies ein Array, und dann ist es nur iteriert über das Array und tut seine Arbeit.
InformationsquelleAutor der Antwort Pablo
Bin ich Schreibe dies, um mich daran zu erinnern...
Oder verwenden Sie einfach diese praktische Funktion $A zu drehen, die meisten Dinge, die in ein array.
Beispiel für die Verwendung...
InformationsquelleAutor der Antwort Orwellophile