typeof判断值是不是基本类型number:
const num = 1; typeof num === 'number'; // true
instanceof判断值是不是包装类Number:
const num = new Number(1); num instanceof Number; // true
Number.isInteger判断值是否是整数:
Number.isInteger(1); // true Number.isInteger('1'); // false Number.isInteger(1.1); // false
这几种方式的缺点,都是只能基于类型判断,无法判断字符串是否是数值。
parseInt和parseFloat解析的时候遇到非法字符结束,返回解析到的数值。也就是说只要字符串头部是合法数值,那么就能解析出数值,哪怕整体不是数值。比如123abc,会被解析程123。
const a = '123abc'; parseFloat(a); // 123 const b = 'a123abc'; parseFloat(b); // NaN const c = '0123abc'; parseFloat(c); // 123 const d = 'a0123abc'; parseFloat(d); // NaN
Number(true); // 1 Number(false); // 0 Number(null); // 0 Number(undefined); // NaN Number(''); // 0 Number('123'); // 123 Number(123); // 123 Number('abc'); // NaN isNaN(true); // false isNaN(false); // false isNaN(null); // false isNaN(undefined); // true isNaN(''); // false isNaN('123'); // false isNaN(123); // false isNaN('abc'); // true isFinite(true); // true isFinite(false); // true isFinite(null); // true isFinite(undefined); // false isFinite(''); // true isFinite('123'); // true isFinite(123); // true isFinite('abc'); // false
Number.isNaN(NaN); // true Number.isNaN(Number.NaN); // true Number.isNaN(0 / 0) // true Number.isNaN(true); // false Number.isNaN(false); // false Number.isNaN(null); // false Number.isNaN(undefined); // false Number.isNaN(''); // false Number.isNaN('123'); // false Number.isNaN(123); // false Number.isNaN('abc'); // false Number.isFinite(true); // false Number.isFinite(false); // false Number.isFinite(null); // false Number.isFinite(undefined); // false Number.isFinite(''); // false Number.isFinite('123'); // false Number.isFinite(123); // true Number.isFinite('abc'); // false
Number.isNaN = Number.isNaN || function(value) { return typeof value === "number" && isNaN(value); }
if (Number.isFinite === undefined) Number.isFinite = function(value) { return typeof value === 'number' && isFinite(value); }
const exp = /^[0-9]+.?[0-9]*/; exp.test('123'); // true exp.test('a123'); // false exp.test(123); // true