前言
本系列使用 lodash 4.17.4版本
此方法對slice
方法進行了引用
本文章不對
slice
方法進行詳細描述,詳細內容請參考我們另一位小組成員的文章(連結在文章末尾)。
正文
原始碼
import slice from './slice.js'
/**
* Creates a slice of `array` with `n` elements dropped from the beginning.
*
* @since 0.5.0
* @category Array
* @param {Array} array The array to query.
* @param {number} [n=1] The number of elements to drop.
* @returns {Array} Returns the slice of `array`.
* @example
*
* drop([1, 2, 3])
* // => [2, 3]
*
* drop([1, 2, 3], 2)
* // => [3]
*
* drop([1, 2, 3], 5)
* // => []
*
* drop([1, 2, 3], 0)
* // => [1, 2, 3]
*/
function drop(array, n=1) {
const length = array == null ? 0 : array.length
return length
? slice(array, n < 0 ? 0 : n, length)
: []
}
export default drop
複製程式碼
解析
引數
該方法接受兩個引數:
第一個引數是一個將被擷取的陣列;
第二個引數是擷取的起始位置的索引。
返回值
該方法返回一個被擷取後的陣列。
方法解析
該方法首先會宣告一個區域性變數length
來存放第一個陣列引數的長度,若為空陣列則長度為0。
之後判斷變數length
是否為真true
(在這裡變數length
會被轉換為布林Boolean
型別,數字型別的值在為0時會轉換為false
,其他值會轉換為true
),若第一個陣列引數不是空陣列,則會為真,否則為假。若length
為真,會引用slice方法從索引值為第二個引數的值的位置開始擷取陣列(在這裡若沒有傳入第二個引數則會預設其為1,若傳入了第二個引數也會對其進行一下判斷,若第二個引數小於0則開始擷取的索引值為0,否則為傳入的第二個引數的值),並將該擷取後的新陣列放回給呼叫該方法的地方;若length
為假,則會返回一個空陣列給呼叫該方法的地方。
注: 該方法沒有對傳入的第一個引數的引數型別進行判斷,所以第一個引數為其他型別的值時也不會丟擲錯誤。
但在除陣列和字串型別以外,其他的型別因為沒有length這個屬性,所以其他型別長度判斷的值會為undefined,在slice
方法內部,若傳入的第一個引數為假(undefined
轉換為布林值為假false
),直接會返回一個空陣列。所以除陣列和字串以外,其他型別的值作為第一個引數傳入該方法會直接得到一個空陣列。
若傳入的第一個引數為字串時,字串是有length
屬性的,即字串的長度。因為字串可看作是由一個個字元所組成的陣列,所以字串會先被轉換成一個個字元組成的陣列,然後被當做陣列進行陣列的擷取操作。
示例
drop([1, 2, 3, 4, 5])
--> [2, 3, 4, 5]
drop([1, 2, 3, 4, 5], 3)
--> [4, 5]
drop([1, 2, 3, 4, 5], 7)
--> []
drop([1, 2, 3, 4, 5], -2)
--> [1, 2, 3, 4, 5]
drop("I love Javascript!")
--> [" ", "l", "o", "v", "e", " ", "J", "a", "v", "a", "s", "c", "r", "i", "p", "t", "!"]
drop(3)
--> []
drop({a: 1, b: 2, c: 3})
--> []
drop(true)
--> []
drop(null)
--> []
drop(undefined)
--> []
複製程式碼
總結
該方法傳入一個陣列和擷取起始的索引值(索引值非必須,預設為1),返回一個被擷取後的新陣列。
相關連結:
每日原始碼分析 - lodash(debounce.js和throttle.js)
本文章來源於午安煎餅計劃Web組 - 殘陽