我发现了一段包含以下循环的代码:
for (var i = 0; i < 3; i++) {
tabMap['tab' + i] = { element : null };
i && (tabMap['tab' + i].left = 'tab' + (i - 1)); //??
i < 2 && (tabMap['tab' + i].right = 'tab' + (i + 1)); //??
}
所选行的含义是什么(带有注释问号的行)?
答案 0 :(得分:2)
这与以下内容相同:
for (var i = 0; i < 3; i++) {
tabMap['tab' + i] = { element : null };
if ( i ) {
tabMap['tab' + i].left = 'tab' + (i - 1); //??
}
if ( i < 2 ) {
tabMap['tab' + i].right = 'tab' + (i + 1); //??
}
}
&amp;&amp;意味着如果确实如此,请检查下一个语句,这就是它放在括号中的原因。它只是上述的捷径。
答案 1 :(得分:2)
您必须了解与逻辑AND(&&
)连接的表达式仅在第一个表达式求值为false(或为假值)之前进行评估。因此,以下代码表示:
if(expr1):evaluate expr2
expr1 && expr2;
在您的情况下,expr1
是索引i
,这意味着您的代码会转换为以下内容:
if (i) {
tabMap['tab' + i].left = 'tab' + (i - 1);
}
如果i
大于零,则此if条件将评估为真。那么,if条件应该是什么样的:
if (i > 0) {
tabMap['tab' + i].left = 'tab' + (i - 1);
}
你的第二个陈述也是如此。
我个人认为通过做一些聪明的事情来隐藏代码的含义是不好的做法,比如expr1 && expr2
。如果你想要做一些事情,如果索引大于零,那么你应该这样写。我知道你没有写代码,但我只是想说出来。