正则之数字直接量校验

541 阅读1分钟
/^[+-]?(((((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这种格式的部分

第四层:两条分支,其实对应的是左右两部分——整数部分可有可无以及小数部分可有可无

有一些细微的差异:

  1. 对于只有整数部分来说,有小数点符号后面可以不跟数字
  2. 对于只有小数部分来说,小数点符号后面必须跟着有数字

其他

有些小伙伴可能会考虑了 Infinity, NaN 它们经过typeof判断也是number类型,是否也算是数字直接量?

关于这一点,我们就需要看相关文档啦~ 这是ECMA-262关于数字直接量的语法说明

很明显,并没有 Infinity, NaN。

倒是在StringNumericLiteral中看到了Infinity

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

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