在下面的代码中,a != b与==
. 我最初的想法是 JavaScript 会对 parseFloat 使用与==
. 任何人都可以解释实际发生的事情,因为我对此有点困惑。b = 129解析时,因此看起来 parseFloat 将解析到第一个非数字字符。
var a = '129t3.98';
var b;
b = parseFloat(a);
我想用这个组合一个非常简单的isNumeric()
函数,但我想先理解它。
在下面的代码中,a != b与==
. 我最初的想法是 JavaScript 会对 parseFloat 使用与==
. 任何人都可以解释实际发生的事情,因为我对此有点困惑。b = 129解析时,因此看起来 parseFloat 将解析到第一个非数字字符。
var a = '129t3.98';
var b;
b = parseFloat(a);
我想用这个组合一个非常简单的isNumeric()
函数,但我想先理解它。
正如您所注意到的,该parseFloat
函数将解析到满足数字文字语法的第一个字符。从规格:
令numberString为trimmedString的最长前缀,它可能是trimmedString本身,满足StrDecimalLiteral的语法。
但是,抽象相等比较算法(就是这样==
做的)不遵循相同的规则:
如果 Type( x ) 是 String 并且 Type( y ) 是 Number ,则返回比较结果 ToNumber( x ) == y
这是内部ToNumber
操作必须说的:
如果语法不能将 String 解释为StringNumericLiteral的扩展,则 ToNumber 的结果为 NaN。
因此,当您尝试将您的字符串与解析它产生的数字进行比较时,您实际上是在比较数字NaN
。
当您给出 a=b 时,b 的值将变为 a,无需任何转换。
当您将值分配为 a=parseFloat(b) 时,如果 b 是字符串类型,那么 a 将是 int 类型。
但如果 a= b 被赋值,那么 a & b 都是相同的类型。
if,2->int, '2' -> string
2=='2' (true)
2 === '2' (false)
通过观察上述转换,您可以相应地处理您的代码。