Lodash原始碼分析-drop.js

DrMoon發表於2017-12-19

前言

本系列使用 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(slice.js)

每日原始碼分析 - lodash(debounce.js和throttle.js)

本文章來源於午安煎餅計劃Web組 - 殘陽

相關文章