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
NodeList
等code