"+ var === + var"如何在内部工作以验证var是否为数字?

Pau*_*ica 51 javascript string validation numbers

看到这个问题:JavaScript中是否有(内置)方法来检查字符串是否为有效数字?并且:jsperf,提出的方法之一就是这样(比照):

var a = "123"
var b = "123b"

if ( +a === +a ) // true

if ( +b === +b ) // false
Run Code Online (Sandbox Code Playgroud)

这个逻辑如何在JavaScript 内部工作以实现这一目标?

我的问题不是如何检查字符串是否是有效数字 - 这已在这里得到解答:验证JavaScript中的十进制数 - IsNumeric().我想了解该声明的+a === +a工作原理.

Que*_*tin 64

+ 将值转换为数字.

a转换为123123 === 123.

b转换为NaN但是NaN !== NaN(因为根据相等规则的步骤4a,NaN它永远不会等于另一个).NaN

  • 值得注意的是,特定的怪癖(`NaN!= NaN`)继承自IEEE 754标准的浮点数,因此实际上适用于大多数语言. (9认同)
  • 步骤4a使这成为可能,并解释了魔术 (4认同)

Jam*_*lly 16

+这里的运营商被称为Unary Plus.

一元加运算符在其操作数之前,并计算其操作数,但尝试将其转换为数字(如果尚未).

+"123"作为123.

+a === +a
-> +"123" === +"123"
  -> 123 === 123
    -> true
Run Code Online (Sandbox Code Playgroud)

+"123b"评估为NaN(非数字),因为b无法使用Unary Plus转换字符,因为没有任何前缀(如0x十六进制),Unary Plus将假定值为十进制(0-9).NaN是一个特殊情况,它不会与任何东西进行比较,包括它自己:

NaN === NaN
-> false

NaN !== NaN
-> true
Run Code Online (Sandbox Code Playgroud)

因此,我们的+b测试用例失败了:

+b === +b
-> +"123b" === +"123b"
  -> NaN === NaN
    -> false
Run Code Online (Sandbox Code Playgroud)

如果您希望两者都评估为true,我们可以isNaN()在最后添加一个调用:

if ( +a === +a || isNaN(+a) )

if ( +b === +b || isNaN(+b) )
Run Code Online (Sandbox Code Playgroud)