Javascript (-1 <= 5 <= 1) === true?

4

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

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

但是这似乎不能正常工作。我知道可以用两个比较和逻辑与来实现,但我想用一个比较来实现。是否有任何原生的JavaScript方法来实现这一点?


1
难以置信这不是重复的问题,但我能找到的最接近的是JavaScript三等号和三变量比较 - Bergi
2个回答

9

请改用以下内容:

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

没有捷径。JavaScript 引擎无法猜测您的意图,这是有充分理由的:您输入的内容是有效的,只是没有按照您想要的方式解释。实际上,您只是在进行测试。

((min <= amount) <= max)

第一个比较的结果是布尔型,会被转换成0或1用在第二个比较中(运算符优先级详情请参考这里,这些比较运算符是从左往右运算)。

如果你真的非常想要一个快捷方法,你可以这样做:

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

但我个人会使用标准解决方案,即使用&&,这样每个人都能看懂,并且不需要额外的函数调用。

附注:我本可以将我的函数命名为in而不是isin,但这可能会破坏ES3浏览器。


我的替代方案看起来和你发布的一样。那么就没有办法这样比较了吗? - Luketep
@Luketep:“没有捷径 - Bergi
记得 true 有时候会有一个值,所以在上面的例子中 3 > 2 的结果是 true,使得表达式的第二部分计算为 true 1,而这个结果是 false。当然了!感谢 void_0 提供这个例子! - Getz

3

运算符(==,<=,<,>=,==)只需要两个参数。

当有多个参数时,它使用数学计算顺序。因此实际上你的代码像这样:

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

这也是最佳选择,因为在执行逻辑语句并查找类似以下内容时:

if(false && (some computing))

由于结果始终为 false ,因此它将忽略(某些计算)

在任何语言中,这都是非常常见的做法。 这样的测试不会出现NullPointerException错误,因为第一个参数已经是false了。

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

if(obj !== undefined && obj.val() > 10) // javascript
if(obj.length != 0 && obj.val() > 10) //jQuery

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