JavaScript中的多个逻辑运算符

3
我希望检查以下内容:

1:x是否为数字
2:如果x小于5或大于15,则发出警报 3:如果一切正常,请调用callMe()

var x = 10;
if (isNaN(x) && ((x < 5) || (x > 15))) {
alert('not allowed')
}
else
{
callMe();
}

我做错了什么?
3个回答

4
var x = 10;
if (isNaN(x) || (x < 5) || (x > 15)) {
    alert('not allowed')
}
else
{
    callMe();
}

如果x不是一个数字,你将直接进入警报。如果它是一个数字,你将进入下一个检查(是x <5),依此类推。


简单而正确。当 x 不是一个数字时,第一个条件为真,它不会检查更多的比较条件。 - eumiro
@Naomi:解释一下你的代码:你的条件是 x 不是一个数字 并且 它应该小于5或大于15。但是,NaN 怎么可能比一个数字小或大呢? - Felix Kling

2

所有关于 && 和 || 的其他答案都是正确的,我只想再添加一件事:

isNaN() 函数仅检查参数是否为常量 NaN。它不检查参数是否实际上是数字或不是数字。所以:

isNaN(10) == false
isNaN('stackoverflow') == false
isNaN([1,2,3]) == false
isNaN({ 'prop' : 'value'}) == false
isNaN(NaN) == true

换句话说,您不能使用它来检查给定变量是否包含数字。为了做到这一点,我建议先通过parseInt()parseFloat()将变量转换为数字,具体取决于您期望的值。之后检查isNaN(),因为这些函数仅返回数字或NaN。此外,这也可以确保如果您有一个数字字符串,则它也被视为数字。

我没有尝试所有的浏览器(也许浏览器处理isNaN的方式已经发生了改变),但你所说的在Chrome 34中是不正确的:http://jsfiddle.net/ss5ja/ - GôTô
@GôTô - 有趣。我不知道是我4年前犯了错误,还是事情确实发生了变化。不过,该函数的行为在其他一些边缘情况下可能会很奇怪:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/isNaN。 - Vilx-
是的...不确定用什么方法替换isNaN最好,因为它似乎确实不可靠! - GôTô

1
var x = 10;
if (isNaN(x) || (x < 5) || (x > 15)) {
    alert('not allowed')
}
else
{
    callMe();
}

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