如果我编写以下代码:

" \t\r\n" == 0


JavaScript将返回true。但是,如果我手动将两个值都转换为布尔值,则:

!!" \t\r\n" // returns true
!!0 // returns false


这意味着JavaScript在第一个表达式中说true == false,但是如果我比较转换为布尔值的值则相反,这对我没有任何意义。

请注意,我不是写!!"0"而是写!!0-很大的不同。

最佳答案

比较

" \t\r\n" == 0


之所以如此,是因为该语言的规范指出它应该是正确的。

让我们从Abstract Equality Comparisonx == y)的算法开始


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


如果第一个是字符串,第二个是数字,请看那里的内容,然后根据ToNumber()操作将第一个转换为数字。

那么ToNumber()操作是什么,here it is in the spec


  应用于字符串的ToNumber将以下语法应用于输入
  串。
  如果语法无法将String解释为
  StringNumericLiteral,则ToNumber的结果为NaN。


关于如何使用ToNumber转换不同字符串的整章相当复杂,但规范中的内容还稍低一些


  StringNumericLiteral ::: [empty]的MV为0
  StringNumericLiteral ::: StrWhiteSpace的MV为0


(MV =数学值)

因此,任何为空或仅包含空格的字符串都将转换为0

让我们自己尝试强制字符串

console.log( +" \t\r\n" ); // gives the number 0


因此,包含空格,制表符和换行符的字符串将转换为0

因此,使用内部" \t\r\n"操作将字符串ToNumber()转换为浏览器0,因此0 == 0自然是true,这就是答案。

09-25 18:04