2012-04-04 14 views
7

Zazwyczaj, gdy chcę sprawdzić typ obiektu (czy jest to tablica, o NodeList, lub cokolwiek), używam następujące:Dlaczego `` .toString.apply (tablica) `nie działa?

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

Pytanie brzmi: dlaczego nie mogę zrobić następujące?

var arr = [] 
{}.toString.apply(arr) // Syntax error: Unexpected token . 

Nie wiem, gdzie jest błąd składni.

mogę zrobić coś zbliża się [] choć następujących prac:

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

Więc ... Jestem zdezorientowany.

+0

zapomniałeś() w toString()? – kappa

+0

Nie, patrz odpowiedź @Ray Toal. Dodanie nawiasu prowadziłoby do błędu składni (obiekt nie ma metody "zastosuj"). –

+0

Ahh .. nie myślałem, że to jest poprawne – kappa

Odpowiedz

16

Po uruchomieniu linii z { JavaScript uważa, że ​​rozpoczyna ona instrukcję bloku, a nie literał obiektu. Nałóż je i będziesz w porządku.

+0

Oh right, '({}). ToString.apply (arr)' działa! Wielkie dzięki: –

+2

@Ray Toal - +1, ale: 'var arr = [] ({}). ToString.apply (arr) // TypeError: obiekt nie jest funkcją' Do pracy kod musi zawierać średniki ';' po każdym wierszu 'var arr = []; ({}). ToString.apply (arr); // działa poprawnie' –

+0

Nie użyłem średników, ponieważ ufam ASI :) Ale oczywiście musisz określić, jeśli zaczynasz linię od nawiasu (jest to jeden z przypadków skrajnych). –