529 Stimmen

Wie funktioniert der "Array.prototype.slice.call"?

Ich weiß, dass es verwendet wird, um arguments eine echte Array aber ich verstehe nicht, was passiert, wenn ich Array.prototype.slice.call(arguments); .

23voto

sam Punkte 38898
// 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]

10voto

naveen Punkte 50832

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);

4voto

Andrey Punkte 41

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.

2voto

ThiefMaster Punkte 297146

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.

2voto

spencerxiong Punkte 21
Array.prototype.slice=function(start,end){
    let res=[];
    start=start||0;
    end=end||this.length
    for(let i=start;i<end;i++){
        res.push(this[i])
    }
    return res;
}

wenn Sie es tun:

Array.prototype.slice.call(arguments) 

arguments wird der Wert von this en slice ,und dann slice gibt ein Array zurück

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X