10

UnderscoreJS の内部を見ると、次のように表示されます。

  _.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 は古いブラウザではサポートされていませんか?

4

2 に答える 2

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

編集1:

この素晴らしい記事をチェックすることもできます:

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

于 2012-05-01T08:38:40.713 に答える
2

drinchevの答えは部分的に正しいです。toStringは現在、ほとんどのブラウザでtypeOfを使用するよりもはるかに低速です。typeOfを使用する彼が投稿したテストの7番目のリビジョンを参照してください。どちらもまだ非常に高速ですが、ほとんどの場合、このパフォーマンスの違いは目立たず、トレードオフはダックタイピング/typeOfよりも仕様に準拠する価値があります。

アンダースコアプルリクエスト321(drinchevにリストされている)には、トレードオフと、toStringを使用することにした理由についての詳細な説明があります。

于 2012-05-23T00:22:42.207 に答える