0

我发现了一些包含以下循环的代码:

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)); //??
}

所选行是什么意思(带有注释问号的行)?

4

2 回答 2

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); //??
  }
}

&& 表示如果为真,请检查下一条语句,这就是为什么将它放在括号中的原因。这只是上述的捷径。

于 2013-07-06T16:31:31.100 回答
2

您必须了解,与逻辑 AND ( &&) 连接的表达式仅在第一个表达式计算为假(或为假)之前计算。所以,下面这段代码的意思是:

  1. 评估 expr1
  2. if (expr1): 评估 expr2

    expr1 && expr2;
    

在您的情况下expr1是 index i,这意味着您的代码转换为如下内容:

if (i) {
    tabMap['tab' + i].left = 'tab' + (i - 1);
}

i如果大于零,则此 if 条件将评估为 true 。那么,if 条件应该是什么样的:

if (i > 0) {
    tabMap['tab' + i].left = 'tab' + (i - 1);
}

你的第二个陈述也是如此。

我个人认为通过做一些聪明的事情来隐藏代码的含义根本不是一个好的做法,比如expr1 && expr2. 如果你想在索引大于零的情况下做某事,那么你应该这样写。我知道你没有写代码,但我只是有这么说的冲动。

于 2013-07-06T16:47:12.520 回答