Javascript “怎么做?”+;var==+;var";内部工作以验证var是否为数字?
看到这个问题:和这个:,提出的方法之一是(经过必要的修改): 这个逻辑在JavaScript内部是如何实现的Javascript “怎么做?”+;var==+;var";内部工作以验证var是否为数字?,javascript,string,validation,numbers,Javascript,String,Validation,Numbers,看到这个问题:和这个:,提出的方法之一是(经过必要的修改): 这个逻辑在JavaScript内部是如何实现的 我的问题是不是如何检查字符串是否为有效数字–这里已经回答了这个问题:。我想了解语句+a===+a是如何工作的。+“123b”是NaN +将值转换为数字 a转换为123和123==123 +a === +a -> +"123" === +"123" -> 123 === 123 -> true b转换为NaN但NaN!==NaN(因为NaN永远不等于另一个N
我的问题是不是如何检查字符串是否为有效数字–这里已经回答了这个问题:。我想了解语句
+a===+a
是如何工作的。+“123b”
是NaN
+
将值转换为数字
a
转换为123
和123==123
+a === +a
-> +"123" === +"123"
-> 123 === 123
-> true
b
转换为NaN
但NaN!==NaN
(因为NaN
永远不等于另一个NaN
。这里的+
操作符称为
一元加号运算符位于其操作数之前,并计算为其操作数,但如果尚未将其转换为数字,则尝试将其转换为数字
+“123”
评估为123
+a === +a
-> +"123" === +"123"
-> 123 === 123
-> true
+“123b”
计算为,因为b
字符不能用一元加号转换为没有任何前缀的字符(如十六进制的0x
),一元加号将假定值为十进制(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) )
这两个变量是string,但是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
这是一个神奇的
NaN
。但是我会使用isNaN(+a)
来实现这一点。这里的核心逻辑是NaN!==NaN
在jsperf中看到Chrome的巨大速度,我准备加倍打赌V8优化了测试,甚至不必运行它!+a===+a | | isNaN(+a)
不总是正确的吗?值得注意的是,这种特殊的怪癖(NaN!=NaN
)是从IEEE 754浮点数标准继承而来的,因此实际上适用于大多数语言。