【问题标题】:Multiple comparison operators in a JavaScript boolean expressionJavaScript 布尔表达式中的多个比较运算符
【发布时间】:2013-05-20 18:32:15
【问题描述】:

我正在尝试检查变量 y 是否小于 x 且大于 z,但是这个布尔表达式由于某种原因返回 false。 JavaScript 是否允许像这样简洁地编写布尔表达式?如果是这样,正确的语法是什么?

x = 2;
y = 3;
z = 4;

if(x > y > z){
    alert("x > y > z"); //Nothing happens!
}

【问题讨论】:

    标签: javascript


    【解决方案1】:

    尝试使用逻辑 and 运算符:

    if (x > y && y > z) {
    

    保证两个条件都为真。

    演示: http://jsfiddle.net/3sxvy/

    如果你需要把它放到一个函数中,你可以试试:

    function compareNumbers(direction) {
        var inOrder = (function () {
            if (direction === "desc") {
                return function (current, before) {
                    return current <= before;
                };
            } else if (direction === "asc") {
                return function (current, before) {
                    return current >= before;
                };
            }
        })();
        var valid = true;
        for (var i = 2; i < arguments.length; i++) {
            if (!inOrder(arguments[i], arguments[i-1])) {
                valid = false;
                break;
            }
        }
        return valid;
    }
    
    if (compareNumbers("desc", 33, 5)) {
        console.log("Good");
    } else {
        console.log("Bad");
    }
    

    演示: http://jsfiddle.net/kn6M4/1/

    【讨论】:

    • 如果我能创建一个真正能够解析“简洁”布尔表达式的函数会更好。
    • 问题是你的“简洁”表达在 JavaScript 中是有意义的,但是不同(见我的回答)。
    • @AndersonGreen 我不知道它是否有帮助,但我添加了一个函数,它可以与比较的结果相同(按升序或降序),你传递的数字与你一样多到功能。它实际上只适用于相同升序/降序的数字。
    【解决方案2】:

    你想要

    if(x > y && y > z){
        alert("x > y > z"); //Nothing happens!
    }
    

    Javascript 将尝试从左到右解析您的原始语句,您最终会将 z 与一个布尔值进行比较,然后将其解析为一个数字(0 或 1)。

    所以你原来的陈述相当于

    if( (x > y && 1 > z) || (x <= y && 0 > z))
    

    【讨论】:

    • 不幸的是,它不如原版简洁。我希望 JavaScript 实际上允许这种简洁的布尔表达式语法。
    • 是的,但它有一点工作的好处!我相信原件是从左到右评估的,这意味着一旦评估了第一部分,下一个评估将是if(true &gt; z) {,这没有任何意义。使您的示例更简洁的相同机制不允许使用像 var x = y || z || g; 这样的东西,这比语法糖有更大的好处。
    • @Ocelot20 没错,但是 JS 实际上会将其转换为一个数字以进行转换,因此它实际上等同于我更新答案中的语句。哪种是有道理的,但显然不是 OP 的意图。
    • @ben336:是的,我猜“毫无意义”我的意思是,就像你说的,这不是最初的意图。
    【解决方案3】:

    将您的测试更改为

    if (x > y && y > z){
    

    当您编写(x &gt; y &gt; z) 时,这相当于((x&gt;y)&gt;z),因此您将布尔值(x&gt;y) 与z 进行比较。在这个测试中,true 被转换为1,它不大于2。

    【讨论】:

    • 这个答案是最好的,因为它简洁,它给出了解决方案并解释了为什么 OP 使用的语法是有效的,但在 JS 中具有不同的含义,bravo!
    猜你喜欢
    • 2017-05-27
    • 1970-01-01
    • 1970-01-01
    • 2011-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-22
    • 2021-02-13
    相关资源
    最近更新 更多