【第三方類庫】underscore.js源碼---each forEach 每次迭代跟{}比較的疑惑

 1   var each = _.each = _.forEach = function(obj, iterator, context) {
 2     if (obj == null) return;
 3     //首先判斷是否支持原生的forEach方法
 4     if (nativeForEach && obj.forEach === nativeForEach) {
 5       obj.forEach(iterator, context);
 6     //判斷是不是數組 +obj.length 是強制類型轉換,轉換成整形,至關於Number(obj.length)
 7     } else if (obj.length === +obj.length) {
 8       for (var i = 0, length = obj.length; i < length; i++) {
 9         //到這裏可能會有疑惑,操做返回的結果跟breaker(一個空的對象)比較,爲何呢?{}比較是內存地址的比較
10         //其實在some方法中,    each(obj, function(value, index, list) {
11         //   if (result || (result = iterator.call(context, value, index, list))) return breaker;
12         // });能夠看到,很顯然,這是underscore內部方便跳出循環的方法
13         if (iterator.call(context, obj[i], i, obj) === breaker) return;
14       }
15     } else {
16       //次方法以及過濾了過貼位notEnumrable屬性的元素.e.g.toString,valueOf...
17       var keys = _.keys(obj);
18       for (var i = 0, length = keys.length; i < length; i++) {
19         if (iterator.call(context, obj[keys[i]], keys[i], obj) === breaker) return;
20       }
21     }
22   };
相關文章
相關標籤/搜索