为什么JavaScript会这样做?

时间:2015-05-28 22:22:45

标签: javascript

为什么JavaScript认为值0等于空字符串?

defValue = 0;
if ( defValue == '' ) defValue = null;
alert( defValue ); // alerts null

defValue = 1;
if ( defValue == '' ) defValue = null;
alert( defValue ); // alerts 1

小提琴:http://jsfiddle.net/L55n0tvj/

2 个答案:

答案 0 :(得分:7)

使用==检查两个值的相等性时,JavaScript会做一些非常有趣的事情。如果值是不同的类型,例如 Number String ,则必须进行初始转换以使两种类型协调一致。

ECMAScript语言规范提供了用于确定两个值之间相等的算法,以及在两个值不同的情况下将转换的值。

Section 11.9.3抽象等式比较算法,概述了表达式 x == y 的步骤,这是您在此处查询的内容。请特别注意算法的第4步:

If Type(x) is Number and Type(y) is String, return the result of the comparison x == ToNumber(y).

因此,我们的空字符串必须首先转换为数字。根据{{​​3}}, ToNumber应用于字符串类型,空字符串的数学值为0.

我们的 x == y 表达式现在是 0 == 0 ,显然是true

如果您想避免强制转换,则应考虑检查 Strict Equality ,而不是Section 9.3.1中所述。如果两个值不是同一类型,则算法立即返回false

答案 1 :(得分:3)

简短:==进行任何必要的类型转换,然后进行评估,因此在这种情况下,转换后的空字符串与0的类型相同;

0 == '' // return true.

所以你需要使用严格的比较(===);

0 === '' // return false;

长:

Section 11.9.6