我对 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) );
答案 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.");
}
或反转 if
和 else
块的内容并使用 ||
而不使用 !
:
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);
a
和 b
可以是 true
或 false
。当您使用 ||
时,您是在告诉这些值中至少有一个应该是 true
。如果您选中 Truth table,您将看到 OR 对 a
和 b
的组合为真:
a == true
, b == true
a == false
, b == true
a == true
, b == false
您想要的是同时检查 a == true
和 b == true
- 因此您必须使用 AND
(&&
) 当且仅当 { {1}} 和 a == true
。