Lodash筆記 slice

loadsh slice方法 相似於數組的slice方法

var baseSlice = require('./_baseSlice'),
    isIterateeCall = require('./_isIterateeCall'),
    toInteger = require('./toInteger');
function slice(array, start, end) {
  var length = array == null ? 0 : array.length;
  if (!length) {
    return [];
  }
  if (end && typeof end != 'number' && isIterateeCall(array, start, end)) {
        start = 0;
        end = length;
      }
      else {
        start = start == null ? 0 : toInteger(start);
        end = end === undefined ? length : toInteger(end);
      }
      return baseSlice(array, start, end);
    }

    module.exports = slice;

slice方法作了些start end有效值判斷 最終仍是調用了baseSlice方法實現 因此重點看下baseSlice方法數組

baseSlice方法

function baseSlice(array, start, end) {
  //length默認爲數組長度
  var index = -1,
      length = array.length;
  //start爲負數的狀況 start取反比數組長度大 start爲0 不然爲start+length 就是從後倒數
  if (start < 0) {
    start = -start > length ? 0 : (length + start);
  }
  //end越界狀況
  end = end > length ? length : end;
  //end爲負數 
  if (end < 0) {
    end += length;
  }
  //length轉爲正整數 >>>爲無符號右移0位 保證是非負整數
  length = start > end ? 0 : ((end - start) >>> 0);
  //start=start>>>0 一樣保證start的爲非負整數
  start >>>= 0;
  //數組的長度已經肯定下來
  var result = Array(length);
  //index從-1開始 自增 小於數組length就按索引賦值 很精簡
  while (++index < length) {
    result[index] = array[index + start];
  }
  return result;
}

module.exports = baseSlice;

關於>>>0無符號右移 能夠看下這篇文章 [js中表達式 >>> 0 淺析]ui

試想一下 若是讓咱們寫一個相似於數組的slice方法 會怎麼實現?loadsh實現的很精簡巧妙 還能夠對類數組進行slice 好比arguments NodeListcode

相關文章
相關標籤/搜索