如何检查数字是否在两个值之间?


144

在JavaScript中,如果窗口大小大于500px,我要告诉浏览器执行某些操作。我这样做是这样的:

if (windowsize > 500) {
    // do this
}

这很好用,但是我想使用相同的方法,但是要有一定范围的数字。所以我想告诉我的浏览器在窗口大小介于500px和600px之间时做些什么。我知道这行不通,但是这是我的想象:

if (windowsize > 500-600) {
    // do this
}

在JavaScript中甚至可能吗?


9
似乎很难解决这个问题。我可以投票重新打开它吗?它写得很好,并提供了示例代码。
卡托2015年

当然,更正确的检查肯定是(windowsize> = 500 && windowsize <= 600)还是if(!(
windowssize

Answers:


225

测试是否windowsize大于500或小于600表示值500或值600本身均不会导致条件变为真。

if (windowsize > 500 && windowsize < 600) {
  // ...
}

1
感谢未定义,只是为了确认这是否会在窗口大小大于500px且小于600px(基本上仅在500-600px范围内起作用)时在浏览器中实现我所希望的,对吗?(我不太喜欢这个东西,哈哈)
Dyck

1
@Dyck是的,它是这样做的:),请注意,jQuery只是一个JavaScript库。
undefined 2013年

7
请注意,只有windowsize在至少501px和最多599px 时,此条件才成立。排除500px和600px。如果要包含这些值,请在比较中添加相等性。
罗伯特·科里特尼克

3
只是一个细节,但以下方式更具可读性:if(500 < windowsize && windowsize < 600)
Giovanni Benussi

119

我花了一点时间,所以,尽管您已经接受了答案,但我认为我会做出以下贡献:

Number.prototype.between = function(a, b) {
  var min = Math.min.apply(Math, [a, b]),
    max = Math.max.apply(Math, [a, b]);
  return this > min && this < max;
};

var windowSize = 550;

console.log(windowSize.between(500, 600));

JS Fiddle演示

或者,如果您希望选择检查数字是否在包括端点在内的已定义范围内:

Number.prototype.between = function(a, b, inclusive) {
  var min = Math.min.apply(Math, [a, b]),
    max = Math.max.apply(Math, [a, b]);
  return inclusive ? this >= min && this <= max : this > min && this < max;
};

var windowSize = 500;

console.log(windowSize.between(500, 603, true));

JS Fiddle演示

进行了修改,对上述内容进行了小幅修改,因为-如评论中所述-

…… Function.prototype.apply()慢!除了在您有固定数量的参数时调用它,是没有意义的……

值得删除使用Function.prototype.apply(),这会产生上述方法的修改版本,首先没有'inclusive'选项:

Number.prototype.between = function(a, b) {
  var min = Math.min(a, b),
    max = Math.max(a, b);

  return this > min && this < max;
};

var windowSize = 550;

console.log(windowSize.between(500, 600));

JS Fiddle演示

并使用“包含”选项:

Number.prototype.between = function(a, b, inclusive) {
  var min = Math.min(a, b),
    max = Math.max(a, b);

  return inclusive ? this >= min && this <= max : this > min && this < max;
}

var windowSize = 500;

console.log(windowSize.between(500, 603, true));

JS Fiddle演示

参考文献:


6
为什么使用apply而不是像直接调用Main.min(a,b)?Function.prototype.apply很慢!除了在您有固定数量的参数时调用它,没有任何意义。
Steel Brain

我将其添加到默认工具箱中-非常方便,感谢您的贡献!
SidOfc

@SteelBrain:您有意思!我已经更新了答案以反映这一点,尽管我最初怀疑是有使用的原因Function.prototype.apply(),但我不知道它是什么或曾经是。
大卫说恢复莫妮卡

6
最好创建一个不修改Number对象的函数。这是一种反模式,如果ECMA标准更改为包括一个Number.between()功能,或者另一个库或另一段代码Number.prototype.between在其他地方使用不同的定义进行了定义,则会来咬您。而是创建一个辅助函数并使用它!
君主瓦迪亚

2
@MonarchWadia尽管您的观点是修改/扩展本机对象是不正确的做法,但我觉得到处都讲这是多余的(不冒犯)。我无法计数看到“不修改本机对象”的次数。对我来说,这就像卖家用刀的人警告买方,每当他/她出售刀时,都会警告刀子可能存在的危险,这就像卖方的责任,如果有任何伤害。危险应该是常识。用户是否忽略他们应该由用户决定。
akinuri

80

我更喜欢将变量放在里面,以进一步提示代码正在验证我的变量在范围值之间

if (500 < size && size < 600) { doStuff(); }

13
我喜欢这种风格!将会适应:)
Kaii

2
这是我的偏爱,因为它更接近python的min < testval < max语法
daveruinseverything

@GouravChawla您是否在谈论此答案中的代码片段示例?我的代码段是Python,用于比较
daveruinseverything

@GouravChawla没有其他人说过。目前尚不清楚您不同意什么。
daveruinseverything

28

这是一个老问题,但是对像我这样的人可能有用。

lodash具有_.inRange()功能https://lodash.com/docs/4.17.4#inRange

例:

_.inRange(3, 2, 4);
// => true

请注意,此方法利用Lodash实用程序库,并且需要访问Lodash的已安装版本。


2
请注意,不包括最终值。例如。_.inRange(10, 0, 10) // => false
卢西奥

由于OP将问题范围限制为Javascript,因此值得注意的是,该方法利用了Lodash实用程序库,并且需要访问Lodash的已安装版本。
查亚·库珀

2

您可以在if条件中使用Multiple子句,而无需编写

if (windowsize > 500-600) {
    // do this
}

因为这在逻辑上真的没有任何意义,JavaScript会读取您的if条件,例如

windowSize > -100 

因为它计算500-600-100

&&例如,您应该使用严格检查这两种情况,如下所示

if( windowSize > 500 && windowSize < 600 ){

// Then doo something

}

0

我刚刚实现了这部分jQuery,以显示和隐藏引导程序模态值。根据用户文本框条目的值范围显示不同的字段。

$(document).ready(function () {
    jQuery.noConflict();
    var Ammount = document.getElementById('Ammount');

    $("#addtocart").click(function () {

            if ($(Ammount).val() >= 250 && $(Ammount).val() <= 499) {
                {
                    $('#myModal').modal();
                    $("#myModalLabelbronze").show();
                    $("#myModalLabelsilver").hide();
                    $("#myModalLabelgold").hide();
                    $("#myModalPbronze").show();
                    $("#myModalPSilver").hide();
                    $("#myModalPGold").hide();
                }
            }
    });

6
在2013年使用jQuery进行微不足道的功能可能是一种选择,但今天却
不可行

3
的确如此,但恐怕人们今天仍会使用它
mgamsjager

1
出于好奇:为什么现在的jQuery比普通的函数更糟糕?
Julix

2
@Julix主要表现,尽管在这种情况下可以忽略不计。一般的观点是“在没有必要时不要使用jQuery”,但是这些注释不是(重新)开始辩论的地方。玩得开心:) i.stack.imgur.com/sGhaO.gif

这只是解决方案的一个实现。OP已经可以访问这些值。因此,jQuery $().val()是无关紧要的,不是必需的。但是,在该问题的原始版本中,OP再次提到了jQuery,以进行简单的算术检查。(叹气)这是第一个错误。
akinuri

0

这是最短的方法:

if (Math.abs(v-550)<50) console.log('short')
if ((v-500)*(v-600)<0) console.log('short')

参数化:

if (Math.abs(v-max+v-min)<max+min) console.log('short')
if ((v-min)*(v-max)<0) console.log('short')

如果您不了解第一面的工作原理,则可以将两面除以2;)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.