4

我想验证给定数字是否在给定范围内:

function validate(min, max, amount) {
    return (min <= amount <= max);
}

但这似乎无法正常工作。我知道我可以通过两个比较和一个逻辑 AND 来做到这一点,但我想在一个比较中做到这一点。是否有任何 NATIVE javascript 方式来实现这一点?

4

2 回答 2

9

改用这个:

return (min <= amount && amount <= max);

没有捷径可走。JavaScript 引擎无法猜测您的意图是有充分理由的:您输入的内容是有效的,只是没有按照您的意愿进行解释。事实上,你在测试

((min <= amount) <= max)

并且第一个比较的结果是一个布尔值,被转换为01用于第二个比较(这里有更多关于运算符优先级的详细信息,这些比较运算符是从左到右的)。

如果你真的想要一个捷径,你可以这样做:

Number.prototype.isin = function(m,M) {
   return m<=this && this<=M; 
};

console.log(0.5.isin(1,2)); // logs false
console.log(3..isin(2,5));  // logs true

但我个人会使用标准解决方案&&,每个人都可以阅读并且不涉及额外的函数调用。

旁白:我本可以调用我的函数inisin但它可能会破坏 ES3 浏览器。

于 2013-05-28T09:07:56.323 回答
3

运算符( == 、 <= 、 < 、 >= 、 == )只接受 2 个参数。

当有更多参数时,它使用数学计算顺序。所以实际上你的代码表现得像:

min <= amount  // true
true <= max // this is illogical

它也是最佳的,因为在执行逻辑语句并找到类似以下内容时:

if(false && (some computing))

它会忽略(some computing),因为结果总是false

这在每种语言中都很常见。这样的测试不会有 NullPointerException 错误,因为第一个参数已经是假的。

if(obj != null && obj.getValue() > 10) //C++,Java, etc.

if(obj !== undefined && obj.val() > 10) // javascript
if(obj.length != 0 && obj.val() > 10) //jQuery
于 2013-05-28T09:14:52.037 回答