diff --git a/src/helpers/helpers.math.ts b/src/helpers/helpers.math.ts index da463aeb04e..0fd2a95132c 100644 --- a/src/helpers/helpers.math.ts +++ b/src/helpers/helpers.math.ts @@ -57,8 +57,15 @@ export function _factorize(value: number) { return result; } +/** + * Verifies that attempting to coerce n to string or number won't throw a TypeError. + */ +function isNonPrimitive(n: unknown) { + return typeof n === 'symbol' || (typeof n === 'object' && n !== null && !(Symbol.toPrimitive in n || 'toString' in n || 'valueOf' in n)); +} + export function isNumber(n: unknown): n is number { - return !isNaN(parseFloat(n as string)) && isFinite(n as number); + return !isNonPrimitive(n) && !isNaN(parseFloat(n as string)) && isFinite(n as number); } export function almostWhole(x: number, epsilon: number) { diff --git a/test/specs/helpers.math.tests.js b/test/specs/helpers.math.tests.js index b6b8e125f09..938742959da 100644 --- a/test/specs/helpers.math.tests.js +++ b/test/specs/helpers.math.tests.js @@ -103,6 +103,8 @@ describe('Chart.helpers.math', function() { expect(math.isNumber(NaN)).toBe(false); expect(math.isNumber(undefined)).toBe(false); expect(math.isNumber('cbc')).toBe(false); + expect(math.isNumber(Symbol())).toBe(false); + expect(math.isNumber(Object.create(null))).toBe(false); }); it('should compute shortest distance between angles', function() {