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 浅析]

试想一下 如果让我们写一个类似于数组的slice方法 会怎么实现?loadsh实现的很精简巧妙 还可以对类数组进行slice 比如arguments NodeList

你可能感兴趣的