“+ 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
被转换为123
和123 === 123
。
b
被转换为NaN
但NaN !== 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
因此,我们的+b
testing用例失败:
+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