为什么Javascript负数不总是真或假?

Oll*_*rds 50 javascript boolean-logic bitwise-operators

-1 == true;        //false
-1 == false        //false
-1 ? true : false; //true
Run Code Online (Sandbox Code Playgroud)

谁能解释一下上面的输出?我知道我可以通过比较0来解决这个问题,但我很感兴趣.我希望至少有一个草率的equals语句是真实的,因为它们进行了隐式类型转换,我当然没想到三元组会得出完全不同的结果.

And*_*y E 65

在前两种情况下,布尔值被转换为数字 - 1表示true,0表示false.在最后一种情况下,它是一个转换为布尔值的数字,除0和NaN之外的任何数字都将转换为true.所以你的测试用例真的更像这样:

-1 == 1; // false
-1 == 0; // false
true ? true : false; // true
Run Code Online (Sandbox Code Playgroud)

任何不是0或1的数字都是如此.

有关更多详细信息,请阅读ECMAScript文档.从第3版[PDF],第11.9.3摘要等式比较算法:

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

值得给出完整的算法读取,因为其他类型可能导致更糟糕的陷阱.

  • 动态打字的模糊线条之一。如果你知道所有的规则,这一切都是有道理的。 (2认同)