2012-04-04 3 views
7

Normalerweise, wenn ich den Typ eines Objekts überprüfen möchten (ob es ein Array ist, ein NodeList, oder was auch immer), ich folgendes verwenden:Warum funktioniert `{} .toString.apply (array)` nicht?

var arr = [] // I don't do this, but it's for the sake of the example 
var obj = {} 
obj.toString.apply(arr) // This works 

Die Frage ist: Warum kann ich nicht tun folgende?

Ich bekomme nicht, wo der Syntaxfehler ist.

Ich kann zwar mit [] etwas näher tun, die folgenden Werke:

var nodeList = document.getElementsByClassName('foo') 
[].forEach.call(nodeList, function(bar) { console.log(bar) }) // Works 

So ... Ich bin verwirrt.

+0

Sie vergessen() in toString()? – kappa

+0

Nein, siehe @Ray Toals Antwort. Das Hinzufügen der Klammern würde zu einem Syntaxfehler führen (Objekt hat keine Methode 'Anwenden'). –

+0

Ahh .. ich habe das nicht gedacht, es ist korrekt – kappa

Antwort

16

Wenn Sie eine Zeile mit { beginnen, denkt JavaScript, dass es eine Blockanweisung und kein Objektliteral startet. Klammern Sie es ein und Sie werden in Ordnung sein.

+0

Oh richtig, '({}). ToString.apply (arr)' funktioniert! Vielen Dank :) –

+2

@Ray Toal - +1 aber: 'var arr = [] ({}). ToString.apply (arr) // TypeError: Objekt ist keine Funktion' Zu arbeiten Code muss Semikolons enthalten ';' nach jeder Zeile 'var arr = []; ({}). ToString.apply (arr); // funktioniert OK' –

+0

Ich habe Semikolons nicht benutzt, weil ich der ASI vertraue :) Aber natürlich müßten Sie es angeben, wenn Sie Ihre Zeile mit einer Klammer beginnen (es ist einer der Randfälle). –

Verwandte Themen