我用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。