在这段 JavaScript 代码中,&& 的含义是什么?
function doIt(a) {
var b = a.parents(),
c = 1;
return b.each(function() {
jQuery(this).hasClass("free-content") && (c = 0)
}), c
}
通常我会认为这是一个逻辑运算符AND,但是我无法理解它在这行中的作用。
在这段 JavaScript 代码中,&& 的含义是什么?
function doIt(a) {
var b = a.parents(),
c = 1;
return b.each(function() {
jQuery(this).hasClass("free-content") && (c = 0)
}), c
}
jQuery(this).hasClass("free-content")
返回一个真值,它将把c
设置为0
。if (jQuery(this).hasClass("free-content")) {
c = 0;
}
var foo = bar && baz || qux;
var foo;
if (bar && baz) {
foo = baz;
} else {
foo = qux;
}
概要:不要使用逻辑运算符作为替换IF语句或节省击键的“聪明”方式。这很可能会回到你或其他人的身上。
我知道有人会反对我的观点(通常是那些不想使用分号的人,因为ASI),但编写只有专家才能理解的代码真的是一个非常糟糕的主意。没有任何反驳的余地。
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
连接在一起,它从左到右评估其操作数,然后“返回”第二个操作数。
b.each(function() {
if(jQuery(this).hasClass("free-content")) {
c = 0;
return false;
}
});
return c;
each
循环内部添加了return false
,因为一旦我们找到了具有该类的元素,我们就不需要再搜索其余的元素了——这是原始代码作者在所有“花哨”中忘记做的事情......他们的循环将继续迭代所有b
的元素,无论它是否已经在第一轮中找到了正在寻找的元素。