为什么JavaScript中的''\ t \ n'== false`?

时间:2011-04-12 11:24:18

标签: javascript type-coercion

在JavaScript中......

'\t\n ' == false // true

我可以假设任何仅由空格字符组成的字符串在JavaScript中被视为等同于false

According to this article,我认为false会转换为0,但无法使用Google找到与false相等的空白。

这是为什么?除了深入研究ECMAScript规范之外,还有一些关于这个主题的好读物吗?

4 个答案:

答案 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);

jsFiddle

如果我出错了,请告诉我。

答案 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。