在JavaScript中......
'\t\n ' == false // true
我可以假设任何仅由空格字符组成的字符串在JavaScript中被视为等同于false
。
According to this article,我认为false
会转换为0
,但无法使用Google找到与false
相等的空白。
这是为什么?除了深入研究ECMAScript规范之外,还有一些关于这个主题的好读物吗?
答案 0 :(得分:3)
This page提供了很好的规则摘要。
按照这些规则,'\t\n '
转换为数字(Number('\t\n') ==> 0
),false
转换为数字(Number(false) ==> 0
),因此两个是平等的。
Alex's answer也是'\t\n ' == false
的特定情况的一个很好的细分。
一个重要的区别是'\t\n '
不虚假。例如:
if ('\t\n ') alert('not falsy'); // will produce the alert
答案 1 :(得分:2)
whitespace == false; // true
输入胁迫,喜欢或讨厌它。
深入研究ES5规范。除了阅读其他人从ES5规范中挖出的内容之外,确实没有其他好的方法。
如果Type(x)是布尔值,则返回比较结果ToNumber(x)== y。
new Number(false) == " "; // true
布尔值转换为0或1.这种情况的原因是whitespace == 0
如果您真的想了解new Number(" ")
,请阅读ES5规范中的9.3.1。
重要的一点是:
StringNumericLiteral ::: StrWhiteSpace的MV为0。
答案 2 :(得分:1)
根据我的阅读和Raynos' answer(以及该党的其他后来者),以下是我认为它的工作方式。
// Original expression
lg('\t\n ' == false);
// Boolean false is converted to Number
lg('\t\n ' == new Number(false));
// Boolean has been converted to 0
lg('\t\n ' == 0);
// Because right hand operand is 0, convert left hand to Number
lg(new Number('\t\n ') == 0);
// Number of whitespace is 0, and 0 == 0
lg(0 == 0);
如果我出错了,请告诉我。
答案 3 :(得分:1)
我认为这个过程可以用递归函数来描述。 (想象一下,我们生活在一个只有JavaScript才有严格的相等运算符的世界。)
function equals(x, y) {
if (typeof y === "boolean") {
return equals(x, +y);
}
else if (typeof x === "string") {
return +x === y;
}
}
StringNumericLiteral为空或仅包含空格将转换为+0。