为什么eval("475957E-8905")=="475957E-8905"是真的?

Pyr*_*oux 4 javascript floating-point implicit-conversion node.js

我用nodeJs创建了一个程序,生成代码,如

eval("XXXXXX") == "XXXXXX"
Run Code Online (Sandbox Code Playgroud)

它运作得很好,但是在某个时刻他给了我这个:

    eval("475957E-8905") == "475957E-8905"
Run Code Online (Sandbox Code Playgroud)

我用Firebug测试了它,结果是true .但我真的不明白为什么.

当然,eval("475957E-8905")回归0 但为什么0 == "475957E-8905"呢?

eli*_*ide 7

这个难题有两个部分:浮点数和类型不敏感的比较使用==.

首先,475957E-8905评估为浮点数475957 * 10 ^ -8905,这个数字非常小; 在浮点方面,它0与javascript的精度限制相同.所以,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"
Run Code Online (Sandbox Code Playgroud)

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