Frage

Ich werde durch John Resig ausgezeichnete Erweiterte JavaScript-Tutorial und ich verstehe nicht, was gründlich die Differenz zwischen den folgenden Anrufen: (bitte beachten Sie, dass die Argumente 'ist ein builtin Javascript Wort und ist nicht gerade ein Array daher mit dem Array.slice des Hacking, anstatt einfach Aufruf arguments.slice)

>>> arguments  
[3, 1, 2, 3]  
>>> Array.slice.call( arguments )  
3,1,2,3 0=3 1=1 2=2 3=3  
>>> Array.slice.call( arguments, 1 )  
[]
>>> Array().slice.call( arguments )  
3,1,2,3 0=3 1=1 2=2 3=3  
>>> Array().slice.call( arguments, 1 )  
1,2,3 0=1 1=2 2=3  

Im Grunde genommen mein Mißverständnis läuft darauf hinaus, den Unterschied zwischen Array.slice und Array (). Scheibe nach unten. Was genau ist der Unterschied zwischen diesen beiden und warum Array.slice.call nicht wie erwartet verhalten? (Das gibt alle, aber das erste Element der Argumentliste zurück).

War es hilfreich?

Lösung

Nicht ganz.

Sehen Sie, was passiert, wenn Sie String.substring.call ( "foo", 1) aufrufen und String () substring.call ( "foo", 2).

>>> String.substring.call("foo", 1)
"1"

>>> String().substring.call("foo", 1)
"oo"

Array.slice ist weder richtig Referenzierung der Slice-Funktion an dem Array-Prototyp noch die Slice-Funktion an jede instantiierten Array-Instanz (wie Array () oder []).

Die Tatsache, dass Array.slice ist auch Nicht-Null überhaupt ist eine falsche Implementierung der Objekt (/ Funktion / Baumeister) selbst. Versuchen Sie, den entsprechenden Code in IE ausgeführt wird, und Sie werden eine Fehlermeldung erhalten, dass Array.slice ist null .

Aus diesem Grunde Array.slice verhält sich nicht korrekt (auch nicht String.substring).

Der Nachweis (die folgende ist etwas, das man sollte nie basierend erwartet auf der Definition von slice () ... wie substring () oben):

>>> Array.slice.call([1,2], [3,4])
3,4

Nun, wenn Sie richtig slice () aufrufen, entweder auf einem instanzierte Objekt oder die Array-Prototyp, Sie bekommen, was Sie erwarten:

>>> Array.prototype.slice.call([4,5], 1)
[5]
>>> Array().slice.call([4,5], 1)
[5]

Ein weiterer Beweis ...

>>> Array.prototype.slice == Array().slice
true
>>> Array.slice == Array().slice
false

Andere Tipps

Array ist nur eine Funktion, wenn auch ein besonderes (verwendet Arrays zu initialisieren). Array.slice ist ein Verweis auf die slice () Funktion in dem Array Prototyp. Es kann nur auf einem Array-Objekt und nicht auf dem Konstruktor (d.h. Array) selbst bezeichnet werden. Array scheint besonders wenn zu verhalten, als Array () gibt ein leeres Array. Dies scheint nicht für nicht-builtin Konstruktorfunktionen zu arbeiten (es müssen Sie neu verwenden). So

Array().slice.call

ist die gleiche wie

[].slice.call

Wie wird jeder Anruf slice.call () arbeiten in den Beispielen, da ein Kontextparameter vorgesehen ist, nicht mitgeliefert werden? Hat slice seine eigene Call-Methode implementieren, damit JavaScript Aufruf Methode überschrieben? Der Aufruf und Anwendung von Methoden nehmen als erste Parameter ein Objekt den Kontext angeben (diese) Objekt auf den Aufruf zu übernehmen.

Ich glaube, Array ist die Art und Array () ist der Konstruktor-Funktion.

Herumspielen in FireBug :

>>> Array === Array()
false

>>> Array.constructor
Function()

>>> Array().constructor
Array()

Nun,

Mit Blick auf http://www.devguru.com/Technologies/ecmascript /quickref/slice.html

Array (). Slice eine Funktion (Konstruktor) in der Array-Klasse ist, es kann nicht als ein Datenelement verwendet werden. Wenn Sie nicht die ‚()‘ verwenden wollten Sie müssen es auf dem Array nennen. dh - arguments.slice (1)

Meine Vermutung ist, dass Array ist ein Prototyp, während Array () Objekt eine tatsächliche Array ist. Je nach Auslegung JavaScript, direkt der Prototyp-Methode eines eingebauten Objekttyp aufrufen könnte funktionieren oder auch nicht. Ich glaube nicht, dass die Spezifikation sagt sie zu arbeiten hat, nur, dass es auf einem instanzierte Objekt Aufruf funktioniert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top