为什么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不一样。
True是Booleantypes, -1,5和17,000,000是Integertypes。
比较'=='比较严格。 即使两个东西有相同的“值”,但不是相同的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";
希望这可以帮助!