underscore源碼學習筆記(二)

2、數組

  1. 首先說說裏面遇見的比較多的一個值:void 0, void自己是一個操做符,對錶達式求值,並返回 undefined。因此void 0 其實就是等於undefined的,因爲undefined自己在瀏覽器中的差別,有些undefined能夠被重寫,因此使用void 0 代替undefined更加安全。void(0)也經常在錨連接中這樣使用:href = javascript:void(0); ,用於取消a標籤的默認行爲
  2. 接下來開始數組部分的源碼學習:
  • 相對複雜的一個函數:flatten,用於將嵌套的數組轉換爲1維數組,或者減小一個維度(shallow爲ture時),而且能夠配置起始位置。
var flatten = function(input, shallow, strict, startIndex) {
    var output = [], idx = 0;
    for (var i = startIndex || 0, length = input && input.length; i < length; i++) {
      var value = input[i];
      if (isArrayLike(value) && (_.isArray(value) || _.isArguments(value))) {
        if (!shallow) value = flatten(value, shallow, strict);
        var j = 0, len = value.length;
        output.length += len;
        while (j < len) {
          output[idx++] = value[j++];
        }
      } else if (!strict) {
        output[idx++] = value;
      }
    }
    return output;
};

主要是利用了遞歸,首先循環數組,若是數組內部元素是數組,則對其遞歸調用自身函數。不然直接將其值賦給Output數組,原理相似於對象的深度clone函數。javascript

function cloneObject(src) {
    var obj;
    if (typeof src === 'object') {
    // 須要注意的是對typeof對null也返回'object'
        if (src === null) {
            obj = null;
        } else {
            obj = {};
            for (var k in src) {
                if (src.hasOwnProperty(k)) {
                    obj[k] = (typeof src[k] === 'object') ? cloneObject(src[k]) : src[k];
                }
            }
        }
    } else {
        obj = src;
    }
    return obj;
}
  • _.uniq函數,主要方法:
for (var i = 0, length = array.length; i < length; i++) {
      var value = array[i];
      var result = [];
      if (!_.contains(result, value)) {
        result.push(value);
        }
return result;

方法相似於經常使用的去重方法,定義一個空對象,將數組每項的值做爲對象的屬性,檢測對象的屬性是否存在,若是不存在,則將其push到結果數組中,並給這個屬性設值,這樣下次有相同的值,那麼這個屬性就是存在的。這裏是依賴內部的_.contains函數來實現的。java

for (var i = 0, length = array.length; i < length; i++) {
      var value = array[i];
      var result = [];
      var a = {};
      if (!a[value]) {
        a[value] = 1;
        result.push(value);
}
return result;
  • indexOf、findIndex、lastIndexOf都是經過循環數組加if比較判斷,比較清楚。
  • _.sortedIndex函數沒有搞太懂。API說是使用二分查找肯定value在list中的位置序號,value按此序號插入能保持list原有的排序。
_.sortedIndex = function(array, obj, iteratee, context) {
    iteratee = cb(iteratee, context, 1);
    var value = iteratee(obj);
    var low = 0, high = array.length;
    while (low < high) {
      var mid = Math.floor((low + high) / 2);
      if (iteratee(array[mid]) < value) low = mid + 1; else high = mid;
    }
    return low;
};

-ps: 發現_.range裏一個var range = Array(length);這種不加new的,還有其餘庫裏new調用構造函數不加括號的,js真的很靈活。。數組

相關文章
相關標籤/搜索