共计 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
等
正文完
发表至: javascript
2019-11-10