在这行代码中,AND运算符的含义是什么?

3

在这段 JavaScript 代码中,&& 的含义是什么?

function doIt(a) {
    var b = a.parents(),
    c = 1;

    return b.each(function() {
        jQuery(this).hasClass("free-content") && (c = 0)
    }), c
}

通常我会认为这是一个逻辑运算符AND,但是我无法理解它在这行中的作用。

尝试获取未经压缩的源代码。 - Bergi
2个回答

4
在这种情况下,逻辑AND运算符用于代替IF语句。如果jQuery(this).hasClass("free-content")返回一个真值,它将把c设置为0
这等同于:
if (jQuery(this).hasClass("free-content")) {
    c = 0;
}

你可能会想知道这意味着什么,这也是我不喜欢这种编码方式并认为它是一种不好的实践的原因。它很难阅读,并且可能会导致混淆,从而产生错误。
此外,值得注意的是逻辑 AND 返回的内容,如果你想使用返回的值:
(逻辑 AND)如果 expr1 可以转换为 false,则返回 expr1;否则,返回 expr2。因此,当与布尔值一起使用时,&& 如果两个操作数都为 true,则返回 true;否则,返回 false.
下面是一个显示糟糕代码的例子,因为它很难跟踪:
var foo = bar && baz || qux;

以上代码等同于:
var foo;
if (bar && baz) {
    foo = baz;
} else {
    foo = qux;
}

概要:不要使用逻辑运算符作为替换IF语句或节省击键的“聪明”方式。这很可能会回到你或其他人的身上。

我知道有人会反对我的观点(通常是那些不想使用分号的人,因为ASI),但编写只有专家才能理解的代码真的是一个非常糟糕的主意。没有任何反驳的余地。


2
return b.each(function () {

    jQuery(this).hasClass("free-content") && (c = 0)
}), c
英译中:

b.each 循环遍历 b 中的所有条目,并检查当前元素是否设置了类 free-content。只有当这个条件成立时,才会评估表达式的第二部分 - 因为它们通过 && 连接在一起,JavaScript 在第一部分为 false 时停止评估这样的表达式,因为此时整个表达式不可能再变为 true。

所以如果存在具有该类的元素,则会评估第二部分 - 从而将 c 设置为值 0(因为那里使用了赋值运算符 =,而不是比较运算符)。

在完成每个循环后,c 的值将返回到外部 - 因为这里通过 逗号运算符,each()c 连接在一起,它从左到右评估其操作数,然后“返回”第二个操作数。


JavaScript允许很多像这样的“花哨”的编码,但正如Marcus在他的回答中已经说过的那样,这很难阅读,并且与其他方法相比没有实际优势。
b.each(function() {
    if(jQuery(this).hasClass("free-content")) {
      c = 0;
      return false;
    }
});
return c;

我在each循环内部添加了return false,因为一旦我们找到了具有该类的元素,我们就不需要再搜索其余的元素了——这是原始代码作者在所有“花哨”中忘记做的事情......他们的循环将继续迭代所有b的元素,无论它是否已经在第一轮中找到了正在寻找的元素。

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