2012-03-01 6 views
8

Rozumiem, dlaczego należy używać Object.prototype.toString() lub String() do sprawdzania typu tablic, ale czy nie jest wystarczająca do sprawdzania funkcji i ciągów znaków? Na przykład polyfill na MDN dla Array.isArray używa:Dlaczego używać toString() do typecheck argumentów, które można sprawdzić za pomocą typeof?

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

To dość oczywiste w przypadku tablic, ponieważ nie można używać typeof do sprawdzania tablic. Valentine wykorzystuje instanceof dla tego:

ar instanceof Array 

Ale na smyczki/funkcje/logicznych/liczb, dlaczego nie korzystać typeof?

jQuery i Underscore zarówno użyć czegoś takiego, aby sprawdzić funkcje:

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

Czy nie jest to równoznaczne z tym robi?

typeof obj === 'function' 

czy nawet to?

obj instanceof Function 

Odpowiedz

15

Ok Myślę, że zorientowałem się, dlaczego widzisz użycie toString. Rozważ to:

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

Pamiętaj, że nie działa z Promises, przynajmniej w Chrome w Firefoksie. 'typeof mypromise === 'object',' toString.call (mypromise) ===' [Obiekt] '', ale 'instancja mypromiseof Promise === true' – Hurelu

1

Pierwszym powodem mogę myśleć, że typeof null powraca object, która zazwyczaj nie jest to, co chcesz (od null nie jest obiektem, ale to typ sam w sobie).

Jednak Object.prototype.toString.call(null) zwraca [object Null].

Ale, jak sugerujesz, jeśli spodziewasz się, że coś jest ciągiem lub innym typem, który dobrze działa z typeof, nie widzę powodu, dla którego nie możesz użyć typeof (i regularnie używam w tym przypadku typeof).

Innym powodem, dla którego biblioteki, takie jak te, które wymieniłeś, wykorzystują wybraną przez siebie metodę, może być po prostu spójność. Możesz użyć typeof, aby sprawdzić Array, więc użyj innej metody i trzymaj się tego przez cały czas.

Aby uzyskać więcej informacji, Angus Croll has an excellent article on the typeof operator.

+0

mówię o sprawdzenie rzeczy pozornie powinno działać bez zarzutu jak struny/funkcje/logicznych/numery – ryanve

+0

++ Nicea Link:] – ryanve

+0

Należy pamiętać, że nie robi współpracuj z Promises, przynajmniej w Chrome w Firefoksie. 'typeof mypromise === 'object',' toString.call (mypromise) ===' [Object] '', ale' instancja mypromiseof Promise === true' – Hurelu

Powiązane problemy