Vor dem Schreiben
In js sehen wir oft die Schreibmethode Array.prototype.slice.call(arguments,0). Natürlich kann jeder die Rolle dieser Methode verstehen, die darin besteht, ein Array-ähnliches Objekt in ein echtes Array umzuwandeln . Lassen Sie mich in Bezug auf diese Methode über mein Verständnis sprechen.
Dabei handelt es sich um die Methode „slice()“ und die Methode „call()“. Lassen Sie uns zunächst kurz auf diese beiden Methoden eingehen.
slice()-Methode
Arrays und Strings verfügen beide über diese Slice-Methode. Die Funktion dieser Methode besteht darin, ein Datenelement abzufangen. Der erste Parameter ist der abzufangende Positionsindex. Der zweite Parameter ist optional und gibt die abzufangende Endposition an. In einem Array ist der Rückgabewert dieser Methode ein Array, das die abgefangenen Elemente enthält. In einer Zeichenfolge ist der Rückgabewert dieser Methode eine Zeichenfolge, die die abgefangene Zeichenfolge enthält.
Diese Methode kann auch negative Werte übergeben. Wenn der Parameter eine negative Zahl ist, wird die positive Zahl, die durch Addition des Parameters und der Länge des Arrays oder Strings erhalten wird, als tatsächlicher Parameter verwendet.
lautet wie folgt:
[1,2,3,4,5,6].slice(2,4); [1,2,3,4,5,6].slice(-4,-2);
Die Rückgabewerte sind alle [3,4], bei denen es sich um Arrays handelt.
'everything'.slice(2,4); 'everything'.slice(-4,-2);
Die Rückgabewerte sind „er“ bzw. „hi“, bei denen es sich um Zeichenfolgen handelt.
Wenn ein Parameter übergeben wird, werden alle Elemente von der Startposition bis zur Endposition ausgegeben. Keine weiteren Beispiele.
Andere ähnliche Methoden für Strings
In Strings gibt es zwei weitere Methoden vom Typ Slice():
substring()- und substr()-Methoden.
Unter anderem bedeutet die Methode substring(), dass substr() zwei Parameter von der Startposition an die Endposition zurückgibt. Der erste Parameter gibt die Anzahl der Zeichen an abgefangen und Die ersten beiden Methoden unterscheiden sich geringfügig.
Wenn der an die Methode übergebene Parameter eine negative Zahl ist, unterscheiden sich diese drei Methoden geringfügig.
Wenn der an die Methode übergebene Parameter eine negative Zahl ist:
slice() addiert, wie oben erwähnt, die negative Zahl zur Länge der Zeichenfolge, um den entsprechenden positiven Wert zu erhalten;
Die Parameter der Methode substring() sind alle auf Null gesetzt;Der erste Parameter der substr()-Methode ist ein positiver Wert, der durch Addition des negativen Werts plus der Länge der Zeichenfolge erhalten wird, und der zweite Parameter wird auf Null gesetzt.
call()- und apply()-Methoden
Die Methoden call() und apply() werden hauptsächlich zur Erweiterung des Funktionsumfangs verwendet.
Die Methoden call() und apply() erhalten zwei Parameter:
apply(): Der erste Parameter ist der Bereich und der zweite das Parameterarray. Der zweite Parameter kann eine Array-Instanz oder ein Argumentobjekt sein.
Die Methode call() empfängt ebenfalls zwei Parameter, die Methode zum Übergeben von Parametern unterscheidet sich jedoch von apply(): Die Parameter der übergebenen Funktion müssen einzeln geschrieben werden.
Da dies nicht der Schwerpunkt ist, werde ich hier nicht auf Details eingehen.
Array.prototype.slice.call(arguments,0)
Die Bedeutung von Array.prototype.slice.call(arguments,0) kann also wie folgt verstanden werden: Für das Array der Argumentklasse rufen wir die Prototypmethode Array.prototype.slice auf und verwenden dazu die Methode call() Beschränken Sie den Bereich auf In Argumenten kann Array.prototype hier als Argument verstanden werden, und Parameter 0 ist der erste Parameter der Slice()-Methode, der der Startpositionsindex ist. Auf diese Weise wird das Array der Argumentklasse in ein echtes Array umgewandelt.
Natürlich können Sie Traversal auch verwenden, um Argumente in ein Array umzuwandeln, sodass der Code natürlich mehr und nicht direkt genug ist.
Wir wissen, dass Array.prototype.slice.call(arguments) Objekte mit Längenattributen in Arrays konvertieren kann, mit Ausnahme der Knotensammlung unter IE (da das DOM-Objekt unter IE in Form eines COM-Objekts, js, implementiert ist). Objekte und COM-Objekte können nicht konvertiert werden)
Zum Beispiel:
var a={length:2,0:'first',1:'second'}; Array.prototype.slice.call(a);// ["first", "second"] var a={length:2}; Array.prototype.slice.call(a);// [undefined, undefined]
Slice hat zunächst zwei Verwendungszwecke, eine ist String.slice und die andere ist Array.slice. Die erste gibt einen String zurück und die zweite gibt ein Array zurück.
Array.prototype.slice.call(arguments) kann Argumente in ein Array konvertieren, dann ist es arguments.toArray().slice(); Können wir an dieser Stelle einfach Array.prototype.slice.call(arguments) sagen? ) Der Prozess besteht darin, den ersten übergebenen Parameter in ein Array umzuwandeln und dann Slice aufzurufen?
Schauen wir uns noch einmal die Verwendung von Anrufen an, wie im folgenden Beispiel gezeigt
可以看出,call了后,就把当前函数推入所传参数的作用域中去了,不知道这样说对不对,但反正this就指向了所传进去的对象就肯定的了。
到这里,基本就差不多了,我们可以大胆猜一下slice的内部实现,如下
Array.prototype.slice = function(start,end){ var result = new Array(); start = start || 0; end = end || this.length; //this指向调用的对象,当用了call后,能够改变this的指向,也就是指向传进来的对象,这是关键 for(var i = start; i < end; i++){ result.push(this[i]); } return result; }
大概就是这样吧,理解就行,不深究。
最后,附个转成数组的通用函数
var toArray = function(s){ try{ return Array.prototype.slice.call(s); } catch(e){ var arr = []; for(var i = 0,len = s.length; i < len; i++){ //arr.push(s[i]); arr[i] = s[i]; //据说这样比push快 } return arr; } }