/^[+-]?(((((0|[1-9][0-9]*)(\.[0-9]*)?)|((0|[1-9][0-9]*)?(\.[0-9]+))))([eE][+-]?[0-9]+)?$|0[oO]?[0-7]+$|0[xX][0-9A-Fa-f]+$|0[bB][01]+$)/
图解
工具网站:Regexper

欢迎大家校验
complex:表示复杂内容
这里我做一个拆解说明——
最外层:/^[+-]?(complex)/,也就是在最外面加符号位
第二层:四种情况,除第一种过于复杂,其他分别是八进制,十六进制和二进制
第三层:/(complex)([eE][+-]?[0-9]+)?$右边部分就是一个是否添加e这种格式的部分
第四层:两条分支,其实对应的是左右两部分——整数部分可有可无以及小数部分可有可无
有一些细微的差异:
- 对于只有整数部分来说,有小数点符号后面可以不跟数字
- 对于只有小数部分来说,小数点符号后面必须跟着有数字
其他
有些小伙伴可能会考虑了 Infinity, NaN 它们经过typeof判断也是number类型,是否也算是数字直接量?
关于这一点,我们就需要看相关文档啦~ 这是ECMA-262关于数字直接量的语法说明


很明显,并没有 Infinity, NaN。
倒是在StringNumericLiteral中看到了Infinity

这里是用在做toNumber的时候的处理,并且如果不满足StringNumericLiteral就会输出NaN

这里可以看到 其实 Infinity, NaN, undefined 是所谓全局对象的属性 额外定义的。