]> git.ipfire.org Git - thirdparty/moment.git/commitdiff
Introduce isNumber function
authorJordan Eldredge <jordan@jordaneldredge.com>
Sun, 6 Nov 2016 04:07:49 +0000 (21:07 -0700)
committerIskren Chernev <iskren.chernev@gmail.com>
Mon, 7 Nov 2016 09:58:11 +0000 (01:58 -0800)
In #3559 @ichernev stated that he would prefer using an `isNumber`
utility function over a naive type check.

This pull request actualizes that preference.

Our new `isNumber` function is slightly more robust than a simple type
check. For example, it will also correctly identify wrapped number
primitives.

https://javascriptweblog.wordpress.com/2010/09/27/the-secret-life-of-javascript-primitives/

src/lib/create/from-anything.js
src/lib/duration/create.js
src/lib/locale/lists.js
src/lib/parse/token.js
src/lib/units/month.js
src/lib/utils/is-number.js [new file with mode: 0644]
src/test/moment/is_number.js [new file with mode: 0644]

index b812952260437e79a0ed33a48ac12ac00a13b464..ae76f8544cfafa9418724a5852416ebf09c2b261 100644 (file)
@@ -1,6 +1,7 @@
 import isArray from '../utils/is-array';
 import isObject from '../utils/is-object';
 import isObjectEmpty from '../utils/is-object-empty';
+import isNumber from '../utils/is-number';
 import isDate from '../utils/is-date';
 import map from '../utils/map';
 import { createInvalid } from './valid';
@@ -75,7 +76,7 @@ function configFromInput(config) {
         configFromArray(config);
     } else if (typeof(input) === 'object') {
         configFromObject(config);
-    } else if (typeof(input) === 'number') {
+    } else if (isNumber(input)) {
         // from milliseconds
         config._d = new Date(input);
     } else {
index 354a5e0faf00bd1216fc1bb6e38cfcda9a67d5e6..09af9e24f7be5813a5413f9ab03c9b67eb5647eb 100644 (file)
@@ -1,4 +1,5 @@
 import { Duration, isDuration } from './constructor';
+import isNumber from '../utils/is-number';
 import toInt from '../utils/to-int';
 import absRound from '../utils/abs-round';
 import hasOwnProp from '../utils/has-own-prop';
@@ -28,7 +29,7 @@ export function createDuration (input, key) {
             d  : input._days,
             M  : input._months
         };
-    } else if (typeof input === 'number') {
+    } else if (isNumber(input)) {
         duration = {};
         if (key) {
             duration[key] = input;
index 4fced6ec57ce4b4ec3b1f2d2fb5d5833d255892d..42f7572e2a9253dd353633ee0e66c48d80055828 100644 (file)
@@ -1,3 +1,4 @@
+import isNumber from '../utils/is-number';
 import { getLocale } from './locales';
 import { createUTC } from '../create/utc';
 
@@ -8,7 +9,7 @@ function get (format, index, field, setter) {
 }
 
 function listMonthsImpl (format, index, field) {
-    if (typeof format === 'number') {
+    if (isNumber(format)) {
         index = format;
         format = undefined;
     }
@@ -37,7 +38,7 @@ function listMonthsImpl (format, index, field) {
 // (true, fmt)
 function listWeekdaysImpl (localeSorted, format, index, field) {
     if (typeof localeSorted === 'boolean') {
-        if (typeof format === 'number') {
+        if (isNumber(format)) {
             index = format;
             format = undefined;
         }
@@ -48,7 +49,7 @@ function listWeekdaysImpl (localeSorted, format, index, field) {
         index = format;
         localeSorted = false;
 
-        if (typeof format === 'number') {
+        if (isNumber(format)) {
             index = format;
             format = undefined;
         }
index 781b9cf3ae9be40984c40e7d552853f9dc4e9864..24b4474f87e2416f5c1920e0f5263de0a14053b3 100644 (file)
@@ -1,4 +1,5 @@
 import hasOwnProp from '../utils/has-own-prop';
+import isNumber from '../utils/is-number';
 import toInt from '../utils/to-int';
 
 var tokens = {};
@@ -8,7 +9,7 @@ export function addParseToken (token, callback) {
     if (typeof token === 'string') {
         token = [token];
     }
-    if (typeof callback === 'number') {
+    if (isNumber(callback)) {
         func = function (input, array) {
             array[callback] = toInt(input);
         };
index 5d5ec5747dbfe8c16605cd83d8c52308abc05173..e454d678a1377969f8a967dd92a0ea6c7b1728e9 100644 (file)
@@ -9,6 +9,7 @@ import { hooks } from '../utils/hooks';
 import { MONTH } from './constants';
 import toInt from '../utils/to-int';
 import isArray from '../utils/is-array';
+import isNumber from '../utils/is-number';
 import indexOf from '../utils/index-of';
 import { createUTC } from '../create/utc';
 import getParsingFlags from '../create/parsing-flags';
@@ -180,7 +181,7 @@ export function setMonth (mom, value) {
         } else {
             value = mom.localeData().monthsParse(value);
             // TODO: Another silent failure?
-            if (typeof value !== 'number') {
+            if (!isNumber(value)) {
                 return mom;
             }
         }
diff --git a/src/lib/utils/is-number.js b/src/lib/utils/is-number.js
new file mode 100644 (file)
index 0000000..e34c783
--- /dev/null
@@ -0,0 +1,3 @@
+export default function isNumber(input) {
+    return typeof value === 'number' || Object.prototype.toString.call(input) === '[object Number]';
+}
diff --git a/src/test/moment/is_number.js b/src/test/moment/is_number.js
new file mode 100644 (file)
index 0000000..c6974c0
--- /dev/null
@@ -0,0 +1,28 @@
+import { module, test } from '../qunit';
+import isNumber from '../../lib/utils/is-number.js';
+
+
+test('isNumber recognizes numbers', function (assert) {
+    assert.ok(isNumber(1), 'simple integer');
+    assert.ok(isNumber(0), 'simple number');
+    assert.ok(isNumber(-0), 'silly number');
+    assert.ok(isNumber(1010010293029), 'large number');
+    assert.ok(isNumber(Infinity), 'largest number');
+    assert.ok(isNumber(-Infinity), 'smallest number');
+    assert.ok(isNumber(NaN), 'not number');
+    assert.ok(isNumber(1.100393830000), 'decimal numbers');
+    assert.ok(isNumber(Math.LN2), 'natural log of two');
+    assert.ok(isNumber(Math.PI), 'delicious number');
+    assert.ok(isNumber(5e10), 'scientifically notated number');
+    assert.ok(isNumber(new Number(1)), 'number primitive wrapped in an object'); // jshint ignore:line
+});
+
+test('isNumber rejects non-numbers', function (assert) {
+    assert.ok(!isNumber(), 'nothing');
+    assert.ok(!isNumber(undefined), 'undefined');
+    assert.ok(!isNumber(null), 'null');
+    assert.ok(!isNumber([1]), 'array');
+    assert.ok(!isNumber('[1,2,3]'), 'string');
+    assert.ok(!isNumber(new Date()), 'date');
+    assert.ok(!isNumber({a:1,b:2}), 'object');
+});