Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/403.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript “怎么做?”+;var==+;var";内部工作以验证var是否为数字?_Javascript_String_Validation_Numbers - Fatal编程技术网

Javascript “怎么做?”+;var==+;var";内部工作以验证var是否为数字?

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

看到这个问题:和这个:,提出的方法之一是(经过必要的修改):

这个逻辑在JavaScript内部是如何实现的


我的问题是不是如何检查字符串是否为有效数字–这里已经回答了这个问题:。我想了解语句
+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浮点数标准继承而来的,因此实际上适用于大多数语言。