Javascript 为什么要评估(“475957E-8905”)==”;475957E-8905“;这是真的吗?

Javascript 为什么要评估(“475957E-8905”)==”;475957E-8905“;这是真的吗?,javascript,node.js,floating-point,implicit-conversion,Javascript,Node.js,Floating Point,Implicit Conversion,我用nodeJs制作了一个程序,它生成如下代码 eval("XXXXXX") == "XXXXXX" 它运行得很好,但有一刻他给了我这个: eval("475957E-8905") == "475957E-8905" 我用Firebug测试了它,结果是true .但我真的不明白为什么 当然,eval(“475957E-8905”)return0 但是为什么0==“475957E-8905”?使用==也比较类型,以了解更多信息: JavaScript既有严格的 类型转换相等比较。 对于

我用nodeJs制作了一个程序,它生成如下代码

eval("XXXXXX") == "XXXXXX"
它运行得很好,但有一刻他给了我这个:

    eval("475957E-8905") == "475957E-8905"
我用Firebug测试了它,结果是
true
.但我真的不明白为什么

当然,
eval(“475957E-8905”)
return
0

但是为什么
0==“475957E-8905”

使用
==
也比较类型,以了解更多信息:

JavaScript既有严格的 类型转换相等比较。 对于严格相等的对象 比较对象必须具有相同的类型和:

  • 当两个字符串具有相同的序列时,它们是严格相等的 字符,相同的长度和长度 对应位置的字符
  • 当两个数字在数字上相等时,它们是严格相等的 相同的数值)。南不是 等于任何东西,包括NaN。 正零和负零相等 相互之间
  • 如果两个布尔操作数均为true或true,则两个布尔操作数严格相等 两者都是错误的
  • 如果两个对象引用同一个对象,则它们严格相等
  • Null和未定义的类型是==(但不是==)。[即Null==未定义(但非Null==未定义)]

检查此文档

此难题有两个部分:浮点数字和使用
=
进行的不区分类型的比较

首先,
475957E-8905
计算为浮点数
475957*10^-8905
,它非常小;在浮点术语中,由于javascript的精度限制,它与
0
相同。因此,
eval(“475957E-8905”)
返回
0

现在,让我们来看拼图的第二部分

=
意味着类型不必匹配,因此nodejs(像任何JavaScript引擎一样)尝试转换其中一个类型,以便能够比较它们

由于
eval(“475957E-8905”)
返回
0
,因此它也尝试将
“475957E-8905”
转换为整数。正如我们所看到的,这也是
0
。因此,比较结果是
0==0
,这是正确的

请注意,如果执行
eval(“3”)==“3”
eval(“3”)==3
,则会发生相同的情况——在每种情况下,字符串都会转换为数字并进行比较

避免此问题

您可以强制进行类型敏感比较,如下所示:

eval("475957E-8905") === "475957E-8905"

它返回false,因为
=
告诉javascript引擎只有在类型和值都匹配时才返回true。

javascript必须将字符串“475957E-8905”转换为一个数字,以便进行比较。当它这样做时,它也将“475957E-8905”转换为0。所以,0==0

如你所见:

"475957E-8905" == 0

这是真的。基本上,您将
eval
语句“475957E-8905”转换为一个数字,然后将另一个“475957E-8905”转换为一个数字进行比较。最后,它们都发生了完全相同的转换过程,它们都是0。

这只是因为它是一个字符串到一个数字,所以失败了。eval(“3”)==“3”也会失败是的,但是eval(“3”)==“3”是正确的,问题是用户应该了解JS比较运算符的工作原理,因为两者都被计算/强制为一个数字,并且数字不能用Javascript表示,所以0==0->true Try alert(+“475957E-8905”);不仅仅是node.js,还有任何Javascript引擎。同样,eval(“3”)=“3”将是错误的,这个答案不是询问者想要的。问题在于他的浮点数。@Xotic750是真的。我澄清了我的答案。@DamienBlack问题在于浮点数和使用不区分类型的比较运算符
eval(“3”)==3
将返回true,而
eval(“3”)==3
将返回false。因此,造成这种情况的不仅仅是使用浮点数。@EdCottrell eval(“475957E-8905”)==475957E-8905也是正确的。他在问为什么。因为eval(“475957E-8905”)为0。