それぞれのメソッドです
代码如下: var each = _.each = _.forEach = function(obj, iterator, context) { if (obj == null) return; if (nativeForEach && obj.forEach === nativeForEach) { obj.forEach(iterator, context); } else if (obj.length === +obj.length) { for (var i = 0, l = obj.length; i < l; i++) { if (iterator.call(context, obj[i], i, obj) === breaker) return; } } else { for (var key in obj) { if (_.has(obj, key)) { if (iterator.call(context, obj[key], key, obj) === breaker) return; } } } };
このメソッドには文があります
if (obj.length === +obj.length)
この文は、要素が数値型であるかどうかを判断するために使用される
if (typeof obj.length === 'number')
と同等です。 typeof と Object.prototype.toString は一般的な書き方です。最後のは一般的ではないため、一般の人には理解するのが困難です。
一部のライブラリには
代码如下: function isNumber1(a){ return typeof a === 'number' }
などの型判定のツール関数が用意されていたり、Object.prototype.toString
代码如下: function isNumber2(a) { return Object.prototype.toString.call(a) === '[object Number]' }
を使ってこの書き方に変更することもできます
代码如下: function isNumber3(a){ return a === +a }
様々な型を使ってテストしてみましょう
代码如下: var arr = ['1', true, false, undefined, null, {}, [], 1] for (var i=0; i<arr.length; i++) { console.log(isNumber3(arr[i])) }
結果配列項目の最後の項目のみが true です。つまり、数値型 a === +a のみが true となります。
なぜ typeof を使用しないのでしょうか? 理論的には、文字列比較はすべての文字を走査する必要があり、パフォーマンスは文字列の長さに直接比例するからです。