我用nodeJs编写了一个程序,该程序生成如下代码

eval("XXXXXX") == "XXXXXX"

它工作得很好,但此刻他给了我这个:
    eval("475957E-8905") == "475957E-8905"

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

当然,eval("475957E-8905")返回0但是为什么要0 == "475957E-8905"

最佳答案

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

首先,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。

10-04 12:06