【问题标题】:If statement treating true as falseif 语句将 true 视为 false
【发布时间】:2020-04-25 22:48:33
【问题描述】:

我在 Javascript 中偶然发现了一个非常奇怪的事件,我无法确定。

这是一个非常简单的if 声明:

let hours = 20;

我在这里放了一个断点,并在调试器中设置了hours = 0我在调试器中测试!hours,确认结果为true,然后点击继续运行if语句。

if (!hours) {
  console.log("Hours is false: " + hours);
} else {
  console.log("Hours is true: " + hours);
}

要记录的预期结果:

小时为假:0

记录的实际结果:

小时为真:0

^ 鼠标悬停在hours 上,因此当前值可见

仅当 hours 最初设置为整数,然后在调试器中设置为 0 时才会发生这种情况。 Javascript 是否有一些关于真值即使在更改后仍保持其状态的模糊规则?

或者这是调试器和代码之间的差异(如果属实,基本上会破坏控制台的意义)?

到底为什么会这样?

【问题讨论】:

  • 我认为当你放入调试器并尝试更改它不会影响所以基本上你有价值将 20 本身这就是它显示真实情况的原因
  • @Teemu,你怎么知道的?虽然很常见。我同意。很多如果错误是因为类型是字符串而不是 int 但通常在 html 发挥作用后在浏览器中。
  • @DILEEPTHOMAS 在调试器中更改值后,当我将鼠标悬停在hours 上时显示为 0
  • 哦,他说在调试器中设置。也许这就是你知道@Teemu的方式
  • typeof hours 在调试器中返回 number

标签: javascript if-statement debugging


【解决方案1】:
if (!hours) {
    console.log("Hours is false: " + hours);
} else {
    console.log("Hours is true: " + hours);
}

如果小时 = 1 则

小时为真:1

或者如果 hours = 0 那么

小时为假:0

或者如果小时 = 20 则

小时为真:20

【讨论】:

    【解决方案2】:

    你必须检查数据类型:

    typeof hours;
    

    0 作为数字在 if 语句中返回 false,这就是为什么使用 !它返回 true。

    var number = 0;
    if (number) console.log(true); else console.log(false);
    output -> false
    if (!number) console.log(true); else console.log(false);
    output -> true
    

    这很明显是 JS。

    【讨论】:

    • 它返回number
    • 0 作为数字在 if 语句中返回 false,这就是为什么使用 !它返回 true。
    • 这就是问题所在 - 它应该返回 true,但实际上它会返回 false
    • 这将是错误的,因为 20 确实如此!这是错误的。对于 0 它是错误的,所以 !这是真的。
    【解决方案3】:

    我在这里放了一个断点,并在调试器中设置了 hours = 0。

    这可能是混乱的根源。如果您的“此处”在代码测试x 的值之后,那么您更改x 的值不会影响执行哪个分支。

    【讨论】:

    • 断点在代码测试值之前。就像我之前指出的,hours 在 if 语句中被分析时实际上是 0
    • 想分享截图吗?
    • 屏幕截图添加到问题
    • 您的屏幕截图显示了@DILEEP THOMAS 的解决方案,根据您自己的说法,它解决了问题...
    【解决方案4】:

    检查这个,打开开发工具并运行代码 sn-p,将范围值更改为 0 或在控制台中输入 hours = 0。两者都可以测试它

    Chrom 版本:版本 79.0.3945.88(官方构建)(64 位)

    let hours = 20;
    debugger
    if (!hours) {
      console.log("Hours is false: " + hours);
    } else {
      console.log("Hours is true: " + hours);
    }

    【讨论】:

    • 这给出了预期的答案......但这不会破坏调试器的目的吗?
    • 那么你能解释一下你想要达到的目标吗?
    • 这回答了我的问题。但是我试图理解 - 调试器的重点是能够在代码正常运行时对其进行测试。如果调试器没有测试代码会运行,那有什么意义呢??
    • 调试器基本上是为了帮助您在每个步骤中发生的事情,您希望您是否需要覆盖它,我觉得它是一个功能,所以假设在运行时如果你有 if else 阻塞当你更新该值以检查它是否在您需要的两种条件下工作,所以我觉得调试器正在执行它需要它的工具的实际目的,基本上是您如何使用它。就像一句名言,如果你给医生一把刀,他会救你,如果你给凶手,他会杀了你!!!
    【解决方案5】:

    你有仔细解析收到的hours 吗?

    !0 === false
    !"0" === true
    !parseInt("0") === false
    

    你有没有把字符串当作整数来计算?

    "0" +  0  === "00"
     0  + "0" === 0
    +"0" + 0  === 0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-30
      • 1970-01-01
      • 1970-01-01
      • 2017-08-10
      • 2021-07-08
      • 1970-01-01
      • 2019-08-26
      相关资源
      最近更新 更多