为什么 JavaScript 中的 "0" == "" 是假的



在ES5规范中,第11.9.3.4-5条规定:

如果Type(x(是Number,Type(y(是String,则返回比较x==ToNumber(y(
如果Type(x(为String,Type(y(为Number,返回比较结果ToNumber(x(==y。

我对此的理解是:
"quot;被强制为数字并且变为0->";0"==0
然后递归地"0";被强制为数字并且也变为0->0==0
因此输出必须为true
,但它是false
你能解释一下原因吗?

console.log("0"=="")

"0"是一个字符串。""也是如此。不涉及任何类型的强制。

0(单个字符,字符代码48(组成的字符串不等同于空字符串。

如果'0'0,则该过程将如您所描述的那样发生:

console.log(0 == "")

空字符串被转换为数字-0,然后0 === 0计算为true。-

(但我建议无论如何都不要使用草率的平等——总是使用严格的平等,你不必担心任何愚蠢的事情(

7.12.4中的第一个子句抽象相等比较是:

  1. 如果类型(x(与类型(y(相同,则
    a。返回执行严格相等比较的结果x===y

7.12.5严格相等比较全文读取:

  1. 如果Type(x(与Type(y(不同,则返回false
  2. 如果Type(x(是Number或BigInt,则
    a。回来类型(x(::等于(x,y(
  3. 返回!SameValue非数字(x,y(

由于"0"""的类型都是String,大小写#1和大小写#2都不适用,因此我们转到7.2.12SameValueNonNumeric(x,y(:

  1. 断言:Type(x(不是Number或BigInt
  2. 断言:Type(x(与Type(y(相同
  3. 如果Type(x(为Undefined,则返回true
  4. 如果Type(x(为Null,则返回true
  5. 如果Type(x(是String,那么
    a。如果x和y是完全相同的代码单元序列(相同的长度和相应索引处的相同代码单元(,则返回true;否则,返回false
  6. 如果Type(x(为布尔型,则a.如果x和y都为true或都为false,则返回true;否则,返回false
  7. 如果Type(x(为Symbol,则a.如果x和y都是相同的Symbol值,则返回true;否则,返回false
  8. 如果x和y是相同的Object值,则返回true。否则,返回false

应该很容易看出案例#5适用于此处:

  1. 如果Type(x(是String,那么
    a。如果x和y是完全相同的代码单元序列(相同的长度和相应索引处的相同代码单元(,则返回true;否则,返回false

还应该很容易看出,"0"""不是完全相同的代码单元序列,因为它们在相应索引处既没有相同的长度,也没有相同的代码单位。

因此,根据7.2.12第5条第a款的第二个备选方案,结果为false

相关内容

  • 没有找到相关文章

最新更新