在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中的第一个子句抽象相等比较是:
- 如果类型(x(与类型(y(相同,则
a。返回执行严格相等比较的结果x===y
7.12.5严格相等比较全文读取:
- 如果Type(x(与Type(y(不同,则返回false
- 如果Type(x(是Number或BigInt,则
a。回来类型(x(::等于(x,y(- 返回!SameValue非数字(x,y(
由于"0"
和""
的类型都是String,大小写#1和大小写#2都不适用,因此我们转到7.2.12SameValueNonNumeric(x,y(:
- 断言:Type(x(不是Number或BigInt
- 断言:Type(x(与Type(y(相同
- 如果Type(x(为Undefined,则返回true
- 如果Type(x(为Null,则返回true
- 如果Type(x(是String,那么
a。如果x和y是完全相同的代码单元序列(相同的长度和相应索引处的相同代码单元(,则返回true;否则,返回false- 如果Type(x(为布尔型,则a.如果x和y都为true或都为false,则返回true;否则,返回false
- 如果Type(x(为Symbol,则a.如果x和y都是相同的Symbol值,则返回true;否则,返回false
- 如果x和y是相同的Object值,则返回true。否则,返回false
应该很容易看出案例#5适用于此处:
- 如果Type(x(是String,那么
a。如果x和y是完全相同的代码单元序列(相同的长度和相应索引处的相同代码单元(,则返回true;否则,返回false
还应该很容易看出,"0"
和""
不是完全相同的代码单元序列,因为它们在相应索引处既没有相同的长度,也没有相同的代码单位。
因此,根据7.2.12第5条第a款的第二个备选方案,结果为false
。