Why does UnderscoreJS use toString.call() instead of typeof?

javascript, underscore.js

Solution

Well actually this is because it is faster to check the `[[Class]]` by checking with `toString`. Also there could be less mistakes, since toString gives you the exact Class ...

check this :

var fn = function() { 
    console.log(typeof(arguments)) // returns object
    console.log(arguments.toString()) // returns object Arguments
}

You could see the benchmark for underscore typeof vs toString here :

http://jsperf.com/underscore-js-istype-alternatives

Also there are some github issues with better explaination :

https://github.com/documentcloud/underscore/pull/332

https://github.com/documentcloud/underscore/pull/321

EDIT 1 :

You could also check this great article :

http://javascriptweblog.wordpress.com/2011/08/08/fixing-the-javascript-typeof-operator/

Problem

Looking under the hood in UnderscoreJS, I see: ``` _.isFunction = function(obj) { return toString.call(obj) == '[object Function]'; }; _.isString = function(obj) { return toString.call(obj) == '[object String]'; }; _.isNumber = function(obj) { return toString.call(obj) == '[object Number]'; }; ``` This seems like an odd choice. Why not just use typeof to determine whether a value is a string, function, or number? Is there a performance gain by using toString? Is typeof not supported by older browsers?

Original source