Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 26 additions & 0 deletions src/isUndefined.bench.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import _isUndefined from 'lodash/isUndefined'
import {bench, describe} from 'vitest'

import {isUndefined} from './isUndefined'

const testCases = [null, 0, '', false, {}, [], 'undefined', NaN]

const ITERATIONS = 1000

describe('isUndefined performance', () => {
bench('hidash', () => {
for (let i = 0; i < ITERATIONS; i++) {
testCases.forEach((testCase) => {
isUndefined(testCase)
})
}
})

bench('lodash', () => {
for (let i = 0; i < ITERATIONS; i++) {
testCases.forEach((testCase) => {
_isUndefined(testCase)
})
}
})
})
51 changes: 51 additions & 0 deletions src/isUndefined.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
import _isUndefined from 'lodash/isUndefined'
import {expect, describe, it} from 'vitest'

import {isUndefined} from './isUndefined'

describe('isUndefined - direct behavior', () => {
it('returns true for undefined', () => {
expect(isUndefined(undefined)).toBe(true)
})

it('returns false for null', () => {
expect(isUndefined(null)).toBe(false)
})

it('returns false for 0', () => {
expect(isUndefined(0)).toBe(false)
})

it('returns false for empty string', () => {
expect(isUndefined('')).toBe(false)
})

it('returns false for false', () => {
expect(isUndefined(false)).toBe(false)
})

it('returns false for empty object', () => {
expect(isUndefined({})).toBe(false)
})

it('returns false for empty array', () => {
expect(isUndefined([])).toBe(false)
})

it('returns false for "undefined" string', () => {
expect(isUndefined('undefined')).toBe(false)
})

it('returns false for NaN', () => {
expect(isUndefined(NaN)).toBe(false)
})
})

describe('isUndefined - lodash parity', () => {
it('matches lodash for various defined values', () => {
const testCases = [null, 0, '', false, {}, [], 'undefined', NaN]
testCases.forEach((value) => {
expect(isUndefined(value)).toBe(_isUndefined(value))
})
})
})
20 changes: 20 additions & 0 deletions src/isUndefined.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,23 @@
/**
* Checks whether the given value is strictly `undefined`.
*
* This function returns `true` only if the input is exactly `undefined`, and `false` for all other values,
* including `null`, `0`, `false`, empty strings, and other falsy values.
*
* It also serves as a TypeScript type guard, narrowing the type of the input to `undefined` when true.
*
* @param value - The value to check.
* @returns Whether the value is `undefined`.
*
* @example
* const a = undefined;
* const b = null;
* const c = 0;
*
* console.log(isUndefined(a)); // true
* console.log(isUndefined(b)); // false
* console.log(isUndefined(c)); // false
*/
export function isUndefined(value: unknown): value is undefined {
return value === undefined
}
Expand Down