如何测试一个变量不等于两个特定的值?

65
我想编写一个if/else语句,测试文本输入框的值是否不等于两个不同值中的任何一个。像这样(请原谅我的伪英语代码):
```javascript var test = $("#test").val(); if (test 不等于 A 或 B){ 做一些事情; } else { 做其他的事情; } ```
我该如何在第2行编写if语句的条件?
8个回答

151

!(否定运算符)看作“不”,||(布尔或运算符)看作“或”,&&(布尔与运算符)看作“且”。请参见运算符运算符优先级

因此:

if(!(a || b)) {
  // means neither a nor b
}

然而,使用德摩根定律,它可以写成:

if(!a && !b) {
  // is not a and is not b
}

ab 可以是任何表达式(例如 test == 'B' 或者其他需要的表达式)。

再次说明,如果表达式是 test == 'A'test == 'B',请注意第一种形式的展开:

// if(!(a || b)) 
if(!((test == 'A') || (test == 'B')))
// or more simply, removing the inner parenthesis as
// || and && have a lower precedence than comparison and negation operators
if(!(test == 'A' || test == 'B'))
// and using DeMorgan's, we can turn this into
// this is the same as substituting into if(!a && !b)
if(!(test == 'A') && !(test == 'B'))
// and this can be simplified as !(x == y) is the same as (x != y)
if(test != 'A' && test != 'B')

3
有没有更短的方式来写这个条件语句(pseudo-code):if(test === ('A' || 'B')) (我删去了!以保持逻辑简单,我更好奇于概念上是否可行) - Ivan Durst
3
最好能有一个类似于 “if(x == 2|3)” 的简短版本。 - Sodj

80

ECMA2016答案,特别适用于检查多个值:

if (!["A","B", ...].includes(test)) {}

6
这是用 JavaScript 回答这个问题的方法。他并不是在问如何使用 && 或 ||,而是在寻找一种快捷方式,使得可以测试 test == ( 'string1' || string2),这等同于 (test == 'string2') || (test == string1)。 - Louis
这是一个古老但相关的参考资料;https://www.tjvantoll.com/2013/03/14/better-ways-of-comparing-a-javascript-string-to-multiple-values/ - Louis
这太好了,谢谢。从来没有想过以这种方式使用.includes()。感觉有点像“反向”使用它,因为我基本上是从变量和它们的值之间的关系的角度来思考的。 相等意味着双向包含,太棒了 :) - ikoza

11

一般来说,它会像这样:

if(test != "A" && test != "B")

你可能需要阅读一下JavaScript逻辑运算符的相关知识。


2
我使用jQuery实现这个功能。
if ( 0 > $.inArray( test, [a,b] ) ) { ... }

如果有人继续得到不想要的结果,那么您还可以检查测试和a、b的typeof是否匹配,以便获得true作为结果。 - Bhumi Singhal
3
我不太喜欢这个,似乎更容易测试 (test != 'A' && test != 'B') 并且读起来更好。 - Shannon Hochkins

2

如果需要检查的值较多,并且经常进行检查,使用 Set 检查该值是否不存在可能更加高效。

const values = new Set(["a", "b"]);
if(!values.has(someValue)){
    // do something
} else {
    // do something else
}

0
var test = $("#test").val();
if (test != 'A' && test != 'B'){
    do stuff;
}
else {
    do other stuff;
}

3
您的意思是,“如果test不等于A且不等于B”,否则它将始终执行(除非test == A == B)。 - Konerak
@Neal:如果该值“不等于两个中的任何一个”,则OP希望执行代码 -> 任意一个 - Konerak
@Neal:这个答案中的if()将始终为true,因为test将始终不等于其中之一。 - user113716
@patrick:那是不正确的,在我的第一条评论中我已经提供了一个反例... - Konerak
@Konerak:请再读一遍我的评论。我同意你的观点。我更新了措辞,使其更加清晰。在原始答案中使用||if()总是评估为true,因为test将始终不是'A''B' - user113716
显示剩余3条评论

0

在你的伪代码中使用了“或”这个词,但根据你的第一句话,我认为你的意思是“并且”。由于人们通常不会这样说话,所以有些混淆。

你想要:

var test = $("#test").val();
if (test !== 'A' && test !== 'B'){
    do stuff;
}
else {
    do other stuff;
}

0

这也可以使用 switch 语句完成。条件的顺序被颠倒了,但这并没有什么区别(而且更简单一些)。

switch(test) {
    case A:
    case B:
        do other stuff;
        break;
    default:
        do stuff;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接