Javascript:使用逻辑非混淆!操作员

时间:2021-03-13 10:25:24

标签: javascript

我对 Javascript 中的逻辑非运算符 (!) 有点困惑。根据我的理解,这主要用于“反转”布尔值。例如,如果布尔值的预期输出为真,则将其放在前面会将其变为假,反之亦然。

在我下面的代码中,我创建了一个函数,允许用户输入一个上下整数,该函数将在这个范围内生成一个随机数。但是,如果用户输入的是字符串而不是整数,则会提示用户输入整数。

我使用 isNaN 来检查用户的输入是否为整数,并在其前面使用逻辑 NOT 运算符来反转结果。

在我的 if 条件下,如果我检查 isNaN for lower && isNaN for upper 都不是数字,这个程序似乎工作正常。但是,如果我使用 ||,它不会按预期工作,如下面的代码所示。

为什么会这样?通过使用 OR 运算符,我是说如果 upper 或 lower 是 NaN,然后​​提示用户输入一个有效的整数。当只有一个条件需要为真时,为什么它是 && 而不是 ||

const getNumber = function(lower, upper) {
  if ( !isNaN(lower) || !isNaN(upper) ) {
  const number = Math.floor(Math.random() * (upper - lower + 1)) + lower;
  return number;
  } else {
  alert("Please enter a valid integer.");
  }
};

// Call the function and pass it different values
console.log( getNumber('six',5) );

2 个答案:

答案 0 :(得分:3)

问题不是 ! 运算符,而是 ||if ( !isNaN(lower) || !isNaN(upper) ) { 表示(大致)“如果 lower 是一个数字 upper 是一个数字”。但是您不想在那里说“或”,因为您希望它们两者都是数字。

所以要么使用 use && (and):

if ( !isNaN(lower) && !isNaN(upper) ) {
// −−−−−−−−−−−−−−−−^^
    const number = Math.floor(Math.random() * (upper - lower + 1)) + lower;
    return number;
} else {
    alert("Please enter a valid integer.");
}

或反转 ifelse 块的内容并使用 || 而不使用 !

if ( isNaN(lower) || isNaN(upper) ) {
    alert("Please enter a valid integer.");
} else {
    const number = Math.floor(Math.random() * (upper - lower + 1)) + lower;
    return number;
}

旁注:您在代码中使用了隐式字符串到数字的解析。我建议故意这样做。我的回答 here 涉及解析数字及其优缺点的各种选项。

答案 1 :(得分:1)

通过使用 OR,您可以检查至少一个值不应为 NaN。

let a = !isNaN(lower);
let b = !isNaN(upper);

ab 可以是 truefalse。当您使用 || 时,您是在告诉这些值中至少有一个应该是 true。如果您选中 Truth table,您将看到 OR 对 ab 的组合为真:

  • a == true, b == true
  • a == false, b == true
  • a == true, b == false

您想要的是同时检查 a == trueb == true - 因此您必须使用 AND (&&) 当且仅当 { {1}} 和 a == true