2012-04-04 9 views
7

Por lo general, cuando quiero comprobar el tipo de un objeto (si se trata de una matriz, un NodeList, o lo que sea), que utilizan la siguiente:¿Por qué no funciona `{} .toString.apply (array)`?

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

La pregunta es: ¿Por qué no puedo hacer ¿el seguimiento?

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

No entiendo dónde está el error de sintaxis.

que puede hacer algo parecido con [] sin embargo, las siguientes obras:

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

Así que ... estoy confundido.

+0

has forgot() en toString()? – kappa

+0

No, mira la respuesta de @Ray Toal. Agregar el paréntesis daría lugar a un error de sintaxis (el objeto no tiene el método 'apply'). –

+0

Ahh ... no pensé eso, es correcto – kappa

Respuesta

16

Cuando comienza una línea con { JavaScript cree que comienza una instrucción de bloque, no un objeto literal. Entrelaza el paréntesis y estarás bien.

+0

Oh, correcto, '({}). ToString.apply (arr)' funciona! Muchas gracias :) –

+2

@Ray Toal - +1 pero: 'var arr = [] ({}). ToString.apply (arr) // TypeError: el objeto no es una función' El código de trabajo debe contener puntos y comas ';' después de cada fila 'var arr = []; ({}). ToString.apply (arr); // funciona bien' –

+0

No utilicé punto y coma porque confío en el ASI :) Pero, por supuesto, tendría que especificarlo si comienza la línea con un paréntesis (es uno de los casos extremos). –

Cuestiones relacionadas