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
等