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

时间:2015-05-12 13:49:44

标签: javascript string validation numbers

看到这个问题: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的工作原理。

4 个答案:

答案 0 :(得分:64)

+将值转换为数字。

a转换为123123 === 123

b转换为NaNNaN !== 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)

答案 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