此行中AND运算符的含义

时间:2014-03-07 11:56:45

标签: javascript

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

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

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

通常我认为这将是一个逻辑运算符AND,但我无法弄清楚它在这一行中做了什么。

2 个答案:

答案 0 :(得分:4)

在这种情况下,使用逻辑 AND 运算符代替 IF - 语句。如果c返回真值,它会将0设置为jQuery(this).hasClass("free-content")

相当于:

if (jQuery(this).hasClass("free-content")) {
    c = 0;
}

你想知道这意味着什么实际上是我不喜欢这种类型的编码并认为这是一种不好的做法。它很难阅读并且可能产生混淆,这反过来会造成错误。


如果您想使用返回的值,还值得注意逻辑 AND 返回的内容:

  

(Logical AND)如果可以转换为false,则返回expr1;否则,返回expr2。因此,当与布尔值一起使用时,&&如果两个操作数都为真,则返回true;否则,返回false。

以下是一个示例,在我看来,这个代码很难显示,因为很难遵循:

var foo = bar && baz || qux;

以上代码相当于:

var foo;
if (bar && baz) {
    foo = baz;
} else {
    foo = qux;
}

总结:不要使用逻辑运算符作为 nifty 方式来替换IF语句或保存击键。它很可能会回来咬你或其他人的屁股。

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

答案 1 :(得分:2)

return b.each(function () {

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

b.each遍历b中的所有条目,并检查当前元素是否设置了类free-content如果得到true,则表达式的第二部分被评估 - 因为它们通过&&连接,并且JavaScript在第一部分为false时停止评估这样的表达式,因为那样整个表达不再成为现实。

因此,如果具有该类的元素,则评估第二部分 - 从而将c设置为值0(因为这是赋值运算符{ {1}}那里,而不是比较)。

=循环结束后,each的值将返回到外部 - 因为ceach()通过comma operator ,连接这里,从左到右评估其操作数,然后“返回”第二个操作数。


JavaScript允许这样的许多“花哨”编码,但正如马库斯在他的回答中已经说过的那样,很难阅读,而且这里没有实际的优势,比如说

c

我在b.each(function() { if(jQuery(this).hasClass("free-content")) { c = 0; return false; } }); return c; 循环中添加了return false,因为一旦我们找到了一个包含该类的元素,我们就不需要再搜索其余的元素 - 这就是那个人谁提出原始代码忘记了他们所有的“幻想”...他们的循环将继续迭代所有each的元素,无论如果它找到它正在寻找的元素第一轮已经。