Lodash笔记-slice

5次阅读

共计 1163 个字符,预计需要花费 3 分钟才能阅读完成。

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

正文完
 0