3

underscore.js ソースコードの _.each メソッドでは、obj.length === +obj.length を使用しています。最初の else if 条件。なぜ彼らはこの + 演算子を使用したのですか? その意味は何ですか?

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;
    }
  }
}

};

4

3 に答える 3

6

演算子は+引数を数値に変換します。次に、「とまったく同じ」演算子を使用して結果===をテストobj.lengthします。

これが実際に意味することはobj.length、(たとえば) string ではなく、 が数値である場合にのみテストが成功するということ"3"です。

于 2013-06-06T05:51:24.093 に答える
3

単項+演算子は文字列を強制的に数値にするため、数値であること===がわかっている左側の引数に対してより高速な演算子を使用できます。

例えば

s = "123";
i = 123;

i === s; // false
i === +s; // true
于 2013-06-06T05:49:12.577 に答える
3
obj.length can be any type even undefined. 
+obj.length is always a number.

したがって、このコードは、長さプロパティが存在し、数値であるかどうかを確認します。このチェックの理由は、_.each() が配列と非配列オブジェクトの両方を受け入れるためです。配列の場合、長さプロパティはその要素を反復処理するために必要ですが、非配列オブジェクトの場合は for..in ループが使用されます。

于 2013-06-06T05:51:34.233 に答える