看到这个问题:Is there a (built-in) way in JavaScript to check if a string is a valid number?和这个:jsperf,提出的方法之一就是这样(经过必要的修改):
var a = "123"
var b = "123b"
if ( +a === +a ) // true
if ( +b === +b ) // false
这个逻辑如何在JavaScript中使用内部来实现这一目标?
我的问题是不如何检查字符串是否为有效数字 - 这已在此处回答:Validate decimal numbers in JavaScript - IsNumeric()。我想了解语句+a === +a
的工作原理。
答案 0 :(得分:64)
+
将值转换为数字。
a
转换为123
和123 === 123
。
b
转换为NaN
但NaN !== NaN
(因为根据step 4a of the equality rules NaN
永远不等于另一个NaN
。
答案 1 :(得分:16)
此处的+
运算符称为Unary Plus。
一元加号运算符在其操作数之前,并计算其操作数,但是如果它已经没有,则尝试将其转换为数字。
+"123"
评估为123
。
+a === +a
-> +"123" === +"123"
-> 123 === 123
-> true
+"123b"
评估为NaN
(Not a Number),因为b
字符无法使用Unary Plus转换为没有任何前缀(例如十六进制的0x
),Unary Plus将假设值为十进制(0-9)。 NaN
是一个特殊情况,因为它不会与任何东西进行比较,包括它自己:
NaN === NaN
-> false
NaN !== NaN
-> true
因此,我们的+b
测试用例失败了:
+b === +b
-> +"123b" === +"123b"
-> NaN === NaN
-> false
如果您希望两者都评估为true,我们可以在最后添加isNaN()
来电:
if ( +a === +a || isNaN(+a) )
if ( +b === +b || isNaN(+b) )
答案 2 :(得分:6)
+"123b"
是NaN
。 NaN is not equal to anything, including NaN.
答案 3 :(得分:0)
这两个变量是字符串,但 javascript 会在 + 或 - 时自动将任何字符串转换为数字。
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