2012-03-01 11 views
8

Entiendo por qué necesita utilizar Object.prototype.toString() o String() para comprobar el tipo de matrices, pero no es typeof suficiente para funciones de verificación de tipo y cadenas? Por ejemplo, la polyfill en MDN para Array.isArray utiliza:¿Por qué usar toString() para tipear argumentos que puede verificar con typeof?

Object.prototype.toString.call(arg) == '[object Array]'; 

que está bastante claro en el caso de las matrices porque no se puede utilizar para comprobar si hay typeof matrices. Valentine utiliza instanceof para esto:

ar instanceof Array 

Pero para cuerdas/funciones/booleanos/números, por qué no usar typeof?

jQuery y Underscore tanto el uso de algo como esto para comprobar si hay funciones:

Object.prototype.toString.call(obj) == '[object Function]'; 

No es eso lo mismo que hacer esto?

typeof obj === 'function' 

o incluso esto?

obj instanceof Function 

Respuesta

15

Ok, creo que descubrí por qué ves el uso de toString. Considere esto:

var toString = Object.prototype.toString; 
var strLit = 'example'; 
var strStr = String('example')​; 
var strObj = new String('example'); 

console.log(typeof strLit); // string  
console.log(typeof strStr); // string 
console.log(typeof strObj); // object 

console.log(strLit instanceof String); // false 
console.log(strStr instanceof String); // false 
console.log(strObj instanceof String); // true 

console.log(toString.call(strLit)); // [object String] 
console.log(toString.call(strStr)); // [object String] 
console.log(toString.call(strObj)); // [object String] 

+1

Tenga en cuenta que no funciona con Promises, al menos en Chrome en Firefox. 'typeof mypromise === 'object',' toString.call (mypromise) ===' [Object] '', pero' mypromise instanceof Promise === true' – Hurelu

1

La primera razón que se me ocurre es que typeof null vuelve object, que no es por lo general lo que quiere (ya null no es un objeto, sino un tipo en su propio derecho).

Sin embargo, Object.prototype.toString.call(null) devuelve [object Null].

Pero, como usted sugiere, si esperas que algo sea una cadena u otro tipo que funciona bien con typeof, no veo ninguna razón por la cual no se puede utilizar typeof (y lo hago regularmente utilizar typeof en ese caso).

Otra razón por la que las bibliotecas como las que menciona utilizan su método elegido puede ser simplemente por coherencia. Puede usar typeof para buscar Array, por lo tanto, use otro método y manténgalo.

Para obtener más información, Angus Croll has an excellent article on the typeof operator.

+0

estoy hablando acerca de la comprobación material de la aparentemente debería funcionar sin problemas como cuerdas/funciones/booleanos/números – ryanve

+0

++ Niza link:] – ryanve

+0

tenga en cuenta que no lo hace Trabaja con Promises, al menos en Chrome en Firefox. 'typeof mypromise === 'object',' toString.call (mypromise) ===' [Object] '', pero' mypromise instanceof Promise === true' – Hurelu

Cuestiones relacionadas