diff --git a/src/core/core.element.js b/src/core/core.element.js index 2ca60692b97..665f20c4302 100644 --- a/src/core/core.element.js +++ b/src/core/core.element.js @@ -42,7 +42,7 @@ function interpolate(start, view, model, ease) { continue; } } - } else if (type === 'number' && isFinite(origin) && isFinite(target)) { + } else if (helpers.isFinite(origin) && helpers.isFinite(target)) { view[key] = origin + (target - origin) * ease; continue; } diff --git a/src/core/core.scale.js b/src/core/core.scale.js index 78ede6985f6..363815e63b6 100644 --- a/src/core/core.scale.js +++ b/src/core/core.scale.js @@ -519,7 +519,7 @@ module.exports = Element.extend({ return NaN; } // isNaN(object) returns true, so make sure NaN is checking for a number; Discard Infinite values - if (typeof rawValue === 'number' && !isFinite(rawValue)) { + if ((typeof rawValue === 'number' || rawValue instanceof Number) && !isFinite(rawValue)) { return NaN; } // If it is in fact an object, dive in one more level diff --git a/src/helpers/helpers.core.js b/src/helpers/helpers.core.js index 2a4b0098ccf..c22dff651b9 100644 --- a/src/helpers/helpers.core.js +++ b/src/helpers/helpers.core.js @@ -51,6 +51,15 @@ var helpers = { return value !== null && Object.prototype.toString.call(value) === '[object Object]'; }, + /** + * Returns true if `value` is a finite number, else returns false + * @param {*} value - The value to test. + * @returns {Boolean} + */ + isFinite: function(value) { + return (typeof value === 'number' || value instanceof Number) && isFinite(value); + }, + /** * Returns `value` if defined, else returns `defaultValue`. * @param {*} value - The value to return if defined. diff --git a/src/plugins/plugin.filler.js b/src/plugins/plugin.filler.js index eb8dad4c3b0..e89bb0d8785 100644 --- a/src/plugins/plugin.filler.js +++ b/src/plugins/plugin.filler.js @@ -128,7 +128,7 @@ function computeBoundary(source) { return target; } - if (typeof target === 'number' && isFinite(target)) { + if (helpers.isFinite(target)) { horizontal = scale.isHorizontal(); return { x: horizontal ? target : null, diff --git a/test/specs/helpers.core.tests.js b/test/specs/helpers.core.tests.js index 80b0640b2cc..e3993de635a 100644 --- a/test/specs/helpers.core.tests.js +++ b/test/specs/helpers.core.tests.js @@ -56,6 +56,24 @@ describe('Chart.helpers.core', function() { }); }); + describe('isFinite', function() { + it('should return true if value is a finite number', function() { + expect(helpers.isFinite(0)).toBeTruthy(); + // eslint-disable-next-line no-new-wrappers + expect(helpers.isFinite(new Number(10))).toBeTruthy(); + }); + + it('should return false if the value is infinite', function() { + expect(helpers.isFinite(Number.POSITIVE_INFINITY)).toBeFalsy(); + expect(helpers.isFinite(Number.NEGATIVE_INFINITY)).toBeFalsy(); + }); + + it('should return false if the value is not a number', function() { + expect(helpers.isFinite('a')).toBeFalsy(); + expect(helpers.isFinite({})).toBeFalsy(); + }); + }); + describe('isNullOrUndef', function() { it('should return true if value is null/undefined', function() { expect(helpers.isNullOrUndef(null)).toBeTruthy();