由OR运算符分隔的语句的评估顺序

时间:2013-11-17 04:43:55

标签: javascript boolean-logic or-operator

这是我的if声明:

和小提琴:http://jsfiddle.net/setMa/

$('#addamenity').click(function () {
    var id = $('.editblock').find('#id').val();
    var amenity = $("#amenity").val();

    var dataString = {
        id: id,
        amenity: amenity
    };
    console.log(dataString);
    if (amenity != '' || id != '') {
        $.ajax({
            type: "POST",
            url: "classes/add_amenities.php",
            data: dataString,
            cache: false,
            async: false,
            success: function (html) {
                $('.editunitamenities').load('classes/display_amenities.php?id=' + id);
            }
        });
    } else {
        alert('You must SAVE your changes to the new unit before adding amenities.');
    }
});

现在,我的控制台日志清楚地显示了""的ID是什么?如果我从||取消if或将文本字段留空,则效果很好。

4 个答案:

答案 0 :(得分:1)

在检查之前,您正在记录它。 变化

var dataString ={id:id,amenity:amenity};
console.log(dataString);    
if (amenity != '' || id != '')
{

if (amenity != '' && id != '')
{
    var dataString ={id:id,amenity:amenity};
    console.log(dataString);    

并且你想要AND(而不是OR),因为否则你的dataString将包含空格(每当一个空白而另一个空白时)。

答案 1 :(得分:1)

只要条件中的至少一个true,逻辑OR运算符就返回true。这意味着,在您的情况下,如果中的任何一个值不为空,则始终会执行if语句。这意味着即使id为空,如果amenity不为空,则语句通过 - 这就是OR完成的内容。

实际上,因为逻辑OR运算符是短路的,所以它甚至不检查id的值:在表达式(amenity != '' || id != '')中,左侧被计算。如果它的计算结果为true,则整个语句变为true,并评估if块;右边被忽略了。

如果amenity != ''的计算结果为false,则OR运算符只返回id != ''。由于左侧是假的,因此仅右侧将确定整个表达式的值,因此返回的是。如果是true,则至少一个条件为true,并评估if块。如果是false,则它们都是,并且跳过if块。

解决方案,如果您真的希望仅对非空ID进行评估,则只检查id:if (id != '')。事实上,在真实性的JavaScript世界中,你可以简单地说if (id),这就是你所需要的。

if (id) {
    // do ajax post
}
else {
    // log errors
}

答案 2 :(得分:1)

从你的问题我真的不知道你在寻找什么。听起来你对条件测试的评估感到沮丧。逻辑“或”运算符表示“如果其任何条款为真,则该陈述为真”。所以你要检查“舒适”,“id”或两者是否“松散地等于”空字符串。这意味着如果分配了舒适性,id或两者,那么“if”语句块中的任何内容都将被执行。下面有一些示例代码向您展示,但同样,很难说出您的目标是什么。

function aTest (amenity, id) {
    aTest.count += 1;
    console.log('### Test # ', aTest.count);
    console.log('amenity = ', amenity);
    console.log('id = ', id);
    if (amenity != '' || id != '') {
        console.log('amenity, id, or both: ' +
                    'is not kinda equal to an empty string');
    }
}
aTest.count = 0;

aTest('', '');
aTest('', 'x');
aTest('x', '');
aTest('x', 'x');

答案 3 :(得分:-1)

修正了它。

我不确定为什么每个人在我需要AND时都会建议OR。如果我只是想让它在两个都空白时失败,我会使用&&。我知道区别......?

我希望.ajax()无法运行,无论#amenity的值如何。我无法弄清楚它为什么不起作用。相反,因为我不在乎#amenity中的内容,所以我决定检查它为什么?我拿了那张支票,一切正常。

if (id != '')
    {
        var dataString ={id:id,amenity:amenity};
        console.log(dataString);    
        $.ajax({        
            type: "POST",
            url: "classes/add_amenities.php",
            data: dataString,
            cache: false,
            async:false,
            success: function(html)
            {
                //$('.editunitamenities').html(html);
                $('.editunitamenities').load('classes/display_amenities.php?id='+id);
            }
        });
        //$('.editunitamenities').load('.editunitamenities');
    }else { alert('You must SAVE your changes to the new unit before adding amenities.'); }