“+ var === + var”如何在内部工作以validationvar是否为数字?

看到这个问题: 在JavaScript中有一个(内置的)方法来检查一个string是否是一个有效的数字? 而这个: jsperf ,提出的方法之一就是(比照适用):

var a = "123" var b = "123b" if ( +a === +a ) // true if ( +b === +b ) // false 

这个逻辑如何在JavaScript 内部工作,使之成为可能?

我的问题不是如何检查一个string是否是一个有效的数字 – 这已经在这里回答: validationJavaScript中的十进制数字 – IsNumeric() 。 我想了解这个陈述+a === +a工作的。

+将该值转换为数字。

a被转换为123123 === 123

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

这里的+运算符被称为Unary Plus

一元加运算符在它的操作数之前,并且计算它的操作数,但是试图把它转换成一个数字(如果它还没有的话)。

+"123"123

 +a === +a -> +"123" === +"123" -> 123 === 123 -> true 

+"123b"计算结果为NaN (不是数字) ,因为b字符不能用Unary Plus转换,因为没有任何前缀(如hex的0x ),Unary Plus将假定值为十进制(0-9)。 NaN是一个特殊的例子,它不能与任何东西进行比较,包括它本身:

 NaN === NaN -> false NaN !== NaN -> true 

因此,我们的+btesting用例失败:

 +b === +b -> +"123b" === +"123b" -> NaN === NaN -> false 

如果你想同时评估为真,我们可以在最后添加一个isNaN()调用:

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

+"123b"NaN 。 NaN不等于任何东西,包括NaN。

这两个variables是string,但是当你+时, javascript会自动将任何string转换为数字。

 var a = "1"; var b = a; // b = "1": a string var c = +a; // c = 1: a number var d = -a; // d = -1: a number 

基本上在你的例子中你尝试这样做:

 if ( +"123" === +"123" ) => ( 123 === 123) // true if ( +"123b" === +"123b" ) => (NaN === NaN) // false