在布尔到数字比较中的JavaScript真实性

fil*_*ppo 5 javascript string boolean

我是JavaScript的新手,我正试图从互联网资源中学习它.虽然我知道,有很多将CR*P物质,有一点大多数人似乎都同意是事物在JS的感实性(只是为了给一个例子去这里)

现在我在实验中发现了这个奇怪的东西:

(true == 2)false.为什么?

据我所知,2是一个非零数字,所以它应该被评估为true.

T.J*_*der 9

这是因为当等价运算符的任一操作数是数字时,几乎在所有情况下,另一个操作数被转换为数字,然后比较结果.所以你最终要1与之比较2,而不是true与之相比true.该规则的唯一例外是null,undefined和对象的默认值(参见下面的主题)是nullundefined; 将数字与那些回报进行比较false(即使Number(null)0;不要问).

规范的细节,第11.9.3节:"抽象等式比较算法"(HTML版本):

比较x == y,其中xy 是值,产生.这样的比较如下进行:

  1. 如果Type(x)与Type(y)相同,那么

    1. 如果Type(x)是Undefined,则返回true.

    2. 如果Type(x)为Null,则返回true.

    3. 如果Type(x)是Number,那么

      1. 如果xNaN,则返回false.

      2. 如果yNaN,则返回false.

      3. 如果xy的 Number值相同,则返回true.

      4. 如果x+0y-0,则返回true.

      5. 如果x-0y+0,则返回true.

      6. 返回false.

    4. 如果Type(x)是String,则如果xy完全相同的字符序列(相应位置的相同长度和相同字符),则返回true.否则,返回 false.

    5. 如果Type(x)是布尔值,如果xy都为true或两者都为false,则返回true.否则,返回false.

    6. 如果xy引用同一个对象,则返回true.否则,返回false.

  2. 如果Xÿ不确定的,返回.

  3. 如果X不确定的Ÿ,返回.

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

  5. 如果Type(x)是String并且Type(y)是Number,则
    返回比较结果ToNumber(x)== y.

  6. 如果Type(x)是布尔值,则返回比较结果ToNumber(x)== y.

  7. 如果Type(y)是布尔值,则返回比较结果x == ToNumber(y).

  8. 如果Type(x)是String或Number而Type(y)是Object,则
    返回比较结果x == ToPrimitive(y).

  9. 如果Type(x)是Object而Type(y)是String或Number,则
    返回比较结果ToPrimitive(x)== y.

  10. 返回false.

如果你想检查它们是否真实或两者都是假的,你可以使用bang(!)或double-bang(!!)成语将它们强制为布尔值:

var a = true,
    b = 2;
alert(a == b);     // "false", 1 !== 2
alert(!!a == !!b); // "true", true === true
alert(!a == !b);   // "true", false === false
a = false;
b = 0;
alert(a == b);     // "true", 0 === 0
alert(!!a == !!b); // "true", false === false
alert(!a == !b);   // "true", true === true
Run Code Online (Sandbox Code Playgroud)

...但通常使用==!=使用布尔值并不理想.但它确实出现了.

我倾向于使用双重爆炸,但在JavaScript中没有理由超过爆炸.(在其他一些语言中有一个关于单一的双重论证,虽然它与一致性相关的弱点if (!!x).在JavaScript中你永远不需要双重爆炸if (x),所以...)


(偏离主题:大多数JavaScript对象的默认值是一个字符串,但通常像"[object Object]"一样,NaN如果将其转换为数字则会结束;但构造函数可以通过valueOf和覆盖该行为toString.默认情况下主机对象的值取决于主机环境.)