diff --git a/src/compat/predicate/isNaN.spec.ts b/src/compat/predicate/isNaN.spec.ts index 68511ceab..4eb9fefbb 100644 --- a/src/compat/predicate/isNaN.spec.ts +++ b/src/compat/predicate/isNaN.spec.ts @@ -9,6 +9,15 @@ describe('isNaN', () => { it('should return `false` for non-NaN numbers', () => { expect(isNaN(0)).toBe(false); + expect(isNaN(new Number(0))).toBe(false); + }); + + it('should return `true` for boxed NaN', () => { + expect(isNaN(new Number(NaN))).toBe(true); + }); + + it('should return `false` for objects inheriting Number.prototype without number data', () => { + expect(isNaN(Object.create(Number.prototype))).toBe(false); }); it('should return `false` for non-numbers', () => { diff --git a/src/compat/predicate/isNaN.ts b/src/compat/predicate/isNaN.ts index 250d94826..dbe31a509 100644 --- a/src/compat/predicate/isNaN.ts +++ b/src/compat/predicate/isNaN.ts @@ -1,3 +1,5 @@ +import { isNumber } from './isNumber'; + /** * Checks if the value is NaN. * @@ -11,5 +13,5 @@ * isNaN(undefined); // false */ export function isNaN(value?: any): boolean { - return Number.isNaN(value); + return isNumber(value) && Number.isNaN(Number(value)); } diff --git a/src/compat/predicate/isNumber.spec.ts b/src/compat/predicate/isNumber.spec.ts index 9f86dda98..ee72f1985 100644 --- a/src/compat/predicate/isNumber.spec.ts +++ b/src/compat/predicate/isNumber.spec.ts @@ -56,6 +56,10 @@ describe('isNumber', () => { expect(isNumber(symbol)).toBe(false); }); + it('should return `false` for objects inheriting Number.prototype without number data', () => { + expect(isNumber(Object.create(Number.prototype))).toBe(false); + }); + it('should match the type of lodash', () => { expectTypeOf(isNumber).toEqualTypeOf(); }); diff --git a/src/compat/predicate/isNumber.ts b/src/compat/predicate/isNumber.ts index b52b678c1..7c54ed26c 100644 --- a/src/compat/predicate/isNumber.ts +++ b/src/compat/predicate/isNumber.ts @@ -1,3 +1,7 @@ +import { isObjectLike } from './isObjectLike.ts'; +import { getTag } from '../_internal/getTag.ts'; +import { numberTag } from '../_internal/tags.ts'; + /** * Checks if a given value is a number. * @@ -16,5 +20,5 @@ * console.log(isNumber(value3)); // false */ export function isNumber(value?: any): value is number { - return typeof value === 'number' || value instanceof Number; + return typeof value === 'number' || (isObjectLike(value) && getTag(value) === numberTag); }