How Lodash _.take Handles Negative Numbers

In the Lodash JavaScript library, the _.take method creates a slice of an array containing a specified number of elements taken from the beginning. When a negative integer is passed as the extraction limit n, Lodash does not count backwards from the end of the array or throw an error. Instead, it treats any negative integer as 0, resulting in an empty array being returned.

Internal Logic and Normalization

The underlying implementation of Lodash's _.take relies on a ternary condition that explicitly checks if the specified count is less than zero:

n = (guard || n === undefined) ? 1 : toInteger(n);
return baseSlice(array, 0, n < 0 ? 0 : n);

When a negative integer such as -1 or -5 is supplied, toInteger(n) preserves the negative value, but the clamp condition n < 0 ? 0 : n forces the upper slice boundary to 0. Consequently, baseSlice(array, 0, 0) is evaluated, which produces an empty array.

Comparison with Native JavaScript slice

This behavior contrasts with the native Array.prototype.slice() method in JavaScript. In native slice(start, end), a negative end parameter indicates an offset from the end of the sequence (e.g., arr.slice(0, -1) omits the final element).

Lodash's _.take deliberately departs from this pattern:

const items = ['a', 'b', 'c', 'd'];

// Native slice with negative limit
items.slice(0, -1);
// => ['a', 'b', 'c']

// Lodash _.take with negative limit
_.take(items, -1);
// => []

Alternatives for Negative Index Operations

Because _.take restricts negative numbers to an empty array output, different Lodash methods should be used depending on the desired outcome: