关于布尔逻辑:为什么Javascript负数不总是为true或false? 您所在的位置:网站首页 js转换布尔值 关于布尔逻辑:为什么Javascript负数不总是为true或false?

关于布尔逻辑:为什么Javascript负数不总是为true或false?

2023-09-12 15:08| 来源: 网络整理| 查看: 265

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

谁能解释以上输出? 我知道我可以通过比较0来解决这个问题,但是我很感兴趣。 我希望至少其中一个草率的equals语句在进行隐式类型转换时是正确的,而且我当然不希望三元函数得出完全不同的结果。

相关讨论 您是否尝试过" ==="? @ Select0r:-1如何成为布尔===? 他们甚至没有相同的类型 @ Select0r很好,在两种情况下肯定会返回false。 我想问题确实是关于草率平等的工作方式。 how can -1 be === to a bool?不能,但是使用类型安全的比较不必担心sloppy equals。

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

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

对于任何不为0或1的数字也是如此。

有关更多详细信息,请阅读ECMAScript文档。摘自第3版[PDF],第11.9.3节"抽象平等比较算法":

19. If Type(y) is Boolean, return the result of the comparison x == ToNumber(y).

值得一读完整的算法,因为其他类型可能会导致更糟的情况。

相关讨论 动态打字模糊线之一。 如果您知道所有规则,那么一切都有意义。 确实模糊行! 将Boolean(-1)用于按您期望的方式进行真实转换-发现-1仍被视为真实(如非0)。 JS(或任何其他动态语言)值中的这些真实/虚假值仅是一个障碍,而不是有用的。 我现在总是在条件中进行完全比较。 如果"除0和NaN以外的任何数字都将转换为true",为什么2 == true输出false?" 2"是一个数字 @jackblank再读一次他的第一句话。 在您的示例中,true强制转换为1,而不是2强制转换为true。此博客文章值得阅读。

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

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

相关讨论 这并不是一个特别有用的答案,因为它根本没有解决JavaScript类型转换/隐式真实性的特殊问题。

当作为测试条件进行评估时,-1、5和17,000,000之类的整数都返回布尔值true,因为它们在逻辑上评估为true,例如

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

(注意:0在逻辑上为假)

使用"?"操作员执行此代码所执行的操作。它在if语句中将第一个参数作为条件传递,将第二个参数作为真实大小写传递,并将第三个参数作为假大小写传递。

因此,第三个结果。

但是,这些整数与true的类型不同。

True是布尔类型,-1、5和17,000,000是整数类型。

就类型比较而言,比较'=='是严格的。即使两个事物具有相同的"值",但类型也不相同," =="运算符也会返回false:

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

即使以下内容也将返回false,因为" true"的类型为String,而true为布尔型:

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

因此,前两个结果。

注意:如果您想比较各种类型的值,请使用" ==="运算符:

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

并且,

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

希望这可以帮助!

相关讨论 在此答案中==与===的解释不正确。 ===用于严格的类型比较,而==将尝试自动转换类型。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有