如果我编写以下代码:
" \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 Comparison(
x == 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
,这就是答案。