为什么Javascript负数不总是正确的或错误的?

-1 == true; //false -1 == false //false -1 ? true : false; //true 

任何人都可以解释上面的输出? 我知道我可以通过比较0来解决这个问题,但我很感兴趣。 我期望至less有一个马虎的平等语句是真实的,因为他们做隐式types转换,而且我当然不希望三元的结果是完全不同的。

在前两种情况下,布尔值被转换为数字 – 1为 ,0为 。 在最后的情况下,它是一个数字,被转换为一个布尔值和除0之外的任何数字,NaN将转换为true 。 所以你的testing案例更像这样:

 -1 == 1; // false -1 == 0; // false true ? true : false; // true 

任何不是0或1的数字都是一样的。

有关更多详细信息,请阅读ECMAScript文档。 从第3版[PDF] ,第11.9.3“抽象平等比较algorithm

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

因为其他types可能导致更糟糕的陷阱,所以值得给予完整的algorithm一个阅读。

在大多数系统中,非零值被认为是一个真值,但这并不一定意味着它们真值是相同的真值。 因此, -1 == true并不一定成立,但-1仍然可以被认为是一个真值,因为它不是零。

实际上,如果可以避免的话,你不应该将整数与布尔值进行比较。

当作为testing条件进行评估时,整数如-1,5和17,000,000,全部返回布尔值为真 ,因为它们在逻辑上评估为真,例如

 if(-1) { "This is true"; } else { "This is false"; } => "This is true"; 

(注意:0逻辑上评估为false)

使用 ”?” 运算符做这个代码只是做。 它在if语句中将第一个参数作为条件传递,将第二个参数作为真实情况传递,并将第三个参数作为情况传递。

因此,第三个结果。

但是,这些整数与真实 types不一样。

TrueBooleantypes, -1,5和17,000,000Integertypes。

比较'=='比较严格。 即使两个东西有相同的“值”,但不是相同的types,“==”运算符返回false

 if(6 == true) { "This is true"; } else { "This is false"; } => "This is false"; 

即使下面的代码也会返回false,因为“true”的types是String,true的types是Boolean

 if("true" == true) { "This is true"; } else { "This is false"; } => "This is false"; 

因此,前两个结果。

注意:如果您想比较不论types的值,请使用“===”运算符:

 if(6 === true) { "This is true"; } else { "This is false"; } => "This is true"; 

并且,

 if("true" === true) { "This is true"; } else { "This is false"; } => "This is true"; 

希望这可以帮助!