2013-05-28 64 views
4

我想验证一个给定的数字是一个给定的范围内:Javascript(-1 <= 5 <= 1)=== true?

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

但是,这似乎并没有正常工作。我知道我可以用两个比较和一个逻辑与来做到这一点,但我希望通过一个比较。有没有任何NATIVE JavaScript的方式来实现这一点?

+1

不能相信这不是欺骗,但我能找到最接近的是[JavaScript的三重平等和三变量比较(http://stackoverflow.com/q/15331947/1048572) – Bergi

回答

9

使用这个代替:

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

没有捷径。 JavaScript引擎无法猜测你的意图是有原因的:你输入的内容是有效的,它只是不被你理解。你正在测试,事实上

((min <= amount) <= max) 

和所述第一比较,这是一个布尔值的结果,被转换为01为第二个(more details here about operators precedence,这些比较运算符是左到右)。

如果你真的一个快捷方式,你可以这样做:

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浏览器。

+0

我替代方案看起来像你发布的内容。所以没有办法像这样比较它? – Luketep

+0

@Luketep:“*没有快捷方式*” – Bergi

+0

http://wtfjs.com/2010/02/23/makes-perfect-sense>请记住真正有时有一个值,所以在上面的3> 2评估为真使表达式的第二部分评估为真,> 1,这是错误的。当然!感谢这个void_0! – Getz

3

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

当有更多的参数时,它使用计算的数学顺序。所以其实你的代码的行为,如:

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

这也是最佳,执行逻辑语句,并找到类似时,因为:

if(false && (some computing)) 

,而忽略(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