2012-05-01 2 views
10

Глядя под капотом в UnderscoreJS, я вижу:Почему UnderscoreJS использует toString.call() вместо typeof?

_.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]'; 
    }; 

Это кажется странным выбором. Почему бы просто не использовать typeof, чтобы определить, является ли значение строкой, функцией или номером? Есть ли увеличение производительности при использовании toString? Является ли typeof не поддерживаться более старыми браузерами?

+0

'typeof' существует в каждой версии JavaScript с версии 1.1 в 1996 году. –

ответ

13

На самом деле это потому, что быстрее проверить [[Class]], установив с помощью toString. Также может быть меньше ошибок, так как ToString дает точный класс ...

проверить это:

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

Вы можете увидеть точку отсчета для подчеркивания TYPEOF против ToString здесь:

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

Также есть некоторые проблемы с github с лучшими пояснениями:

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

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

EDIT 1:

Вы также можете проверить эту большую статью: ответ

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

+0

Отличные ссылки. Благодаря! –

+1

/! \ Http://jsperf.com/underscore-js-istype-alternatives/7 (ответ «DriverDan») – BeauCielBleu

2

drinchev является частично правильным. toString в настоящее время намного медленнее, чем использование typeOf в большинстве браузеров. See the 7th revision of the test he posted который использует typeOf. Оба они все еще очень быстрые, хотя в большинстве случаев разница в производительности не будет заметной, и компромисс стоит соответствовать спецификациям лучше, чем утка typing/typeOf.

Underscore pull request 321 (что перечислены в списке), содержит подробное обсуждение компромиссов и почему они решили использовать toString.

Смежные вопросы