2012-02-08 5 views

答えて

30

if (typeof obj.length == 'number')の別の書き方です。なぜ彼らはそれをそうするのか、それは誰の推測でもあります。おそらく読みやすさを犠牲にして巧みにしようとしています。それはminifiers(YUI CompressorClosure CompilerUglifyJS、など)によって、より圧縮することができるようになるかもしれませんが、残念ながら...

、これらの日あまりにも珍しくどちらではありません。 (typeof a.length=='number')

(a.length===+a.length)

これを実行すると、各インスタンスが5バイト節約されます。

+0

保存5バイトものの(「なぜ、彼らはそれを使うのですか」の第二部に答えますとにかくクロムの中で)http://jsperf.com/obj-length-vs-typeof-number – j03m

24

objlengthのプロパティが数値であるかどうかをテストします。

unary + operatorは、そのオペランドを数値に変換し、lengthの結果とstrict equality operatorは、タイプ強制を実行せずに結果を比較します。

したがって、obj.lengthが実際の数(数字に変換できる文字列など)でない場合、式はtrueになります。

2

+obj.lengthobj.lengthに番号を付けます。 これはobj.lengthが数字かどうかをテストすることだと思います。

4

obj.lengthが数字の場合の主な理由は、Objectのobj型と[object Array]を区別することです(StringオブジェクトとFunctionオブジェクトでも機能します)。 [オブジェクトオブジェクト]には長さプロパティはありません。

ので

obj = {a:1, b:2}; //obj.length = undefined 

obj.length === +obj.length 
undefined === NaN //false - you know that your obj has type Object 
// (or some other object, but not Array, !String and !Function) 
// so, you need to determine size of the obj in some way 
// or use for in loop to iterate over your obj 

よろしく

PSの場合:IMOそれはいくつかPERFの犠牲に質問

+0

このテストで「else」節が必要な理由を教えてくれてありがとう、オブジェクトキー/項目をループする古典的な "for"の代わりにループ)。 –

関連する問題