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

IT技术 javascript
2021-01-18 13:57:26

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

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

这很好用,但我想应用相同的方法,但要使用一系列数字。所以如果窗口大小在 500px 和 600px 之间,我想告诉我的浏览器做一些事情。我知道这行不通,但这是我的想象:

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

在 JavaScript 中,这甚至可能吗?

6个回答

测试是否windowsize大于500和小于600意味着值500600本身都不会导致条件变为真。

if (windowsize > 500 && windowsize < 600) {
  // ...
}
哇,这太神奇了!
2021-03-20 13:57:26
请注意,此条件仅windowsize在至少 501 像素和最多 599 像素时才成立。500px 和 600px 被排除在外。如果您想包含这些值,请在比较中添加相等性。
2021-03-22 13:57:26
感谢未定义,只是为了确认当窗口大小大于 500 像素且小于 600 像素时,这将在浏览器中执行我想要的操作,基本上仅在 500-600 像素范围内运行,对吗?(我不太擅长这个东西哈哈)
2021-03-28 13:57:26
@Dyck 是的,确实如此 :),请注意 jQuery 只是一个 JavaScript 库。
2021-03-28 13:57:26
只是一个细节,但通过以下方式更具可读性: if(500 < windowsize && windowsize < 600)
2021-04-06 13:57:26

我有时间,所以,虽然你已经接受了答案,但我想我会做出以下贡献:

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小提琴演示

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

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小提琴演示

鉴于 - 正如评论中所指出的 -

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

值得删除的使用Function.prototype.apply(),它产生了上述方法的修改版本,首先没有“包含”选项:

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小提琴演示

并使用“包含”选项:

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小提琴演示

参考:

@SteelBrain:你说的有道理!我已经更新了答案以反映这一点,尽管我怀疑我 - 最初 - 有使用原因Function.prototype.apply(),但我想不出它是什么,或者可能是什么。
2021-03-22 13:57:26
为什么使用 apply 而不是直接调用Main.min(a,b)Function.prototype.apply 很慢!除了当你有固定数量的参数时调用它是没有意义的。
2021-04-02 13:57:26
我要将它添加到我的默认工具箱中 - 非常方便,感谢您的贡献!
2021-04-07 13:57:26
创建一个不修改Number对象的函数要好得多这是一种反模式,如果 ECMA 标准更改为包含一个Number.between()函数,或者如果另一个库或另一段代码Number.prototype.between在别处定义了不同的定义,它就会来咬你相反,创建一个辅助函数并使用它!
2021-04-07 13:57:26
@MonarchWadia 虽然您的观点认为修改/扩展本机对象是不好的做法是有道理的,但我觉得到处宣扬这一点有点多余(无意冒犯)。我数不清我见过“不要修改本机对象”的次数。对我来说,这就像有人卖家用刀一样警告买家每次他/她卖刀时可能存在的危险,如果有任何伤害,卖家有责任。危险应该是常识。是否忽略它们应该取决于用户。
2021-04-08 13:57:26

我更喜欢将变量放在里面,以给出一个额外的提示,即代码正在验证我的变量是否在一个范围值之间

if (500 < size && size < 600) { doStuff(); }
@GouravChawla 你在谈论这个答案中的代码片段示例吗?我的代码片段是 Python,用于比较
2021-03-15 13:57:26
@GouravChawla 没有人另有说法。目前还不清楚你不同意什么。
2021-03-21 13:57:26
这是我的偏好,因为它更接近 python 的min < testval < max语法
2021-03-24 13:57:26
我喜欢这种风格!会适应的:)
2021-04-07 13:57:26

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

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

例子:

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

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

由于 OP 将问题范围限制为Javascript,因此值得注意的是,此方法利用了Lodash实用程序库,并且需要访问已安装的 Lodash 版本。
2021-03-22 13:57:26
请注意,不包括最终值。例如。_.inRange(10, 0, 10) // => false
2021-04-03 13:57:26

您可以在if条件中使用 Multiple 子句而不是编写

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

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

windowSize > -100 

因为它计算500-600-100

您应该使用&&严格检查这两种情况,例如看起来像这样

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

// Then doo something

}