试图用三元运算符理解这个JavaScript For循环

时间:2017-11-03 09:45:57

标签: javascript

var res = '\n', i, j;
for (i = 1; i <= 7; i++) {                
    for (j = 1; j <= 15; j++) {
        res += (i * j) % 8 ? ' ' : '*';
    }
    res += '\n';
}
alert(res);

(从面向对象的JavaScript复制/粘贴 - 第三版,Ved Antani,Stoyan Stefanov)

试图理解这个循环。 我理解发生了什么但不是为什么。

res += (i * j) % 8 ? ' ' : '*';

我按如下方式阅读三元运算符。

  • 布尔表达式:(i * j) % 8
  • 如果为true则执行:使用res
  • 连接空格
  • 如果为false则执行:使用res
  • 连接星号

在第一次迭代中,当涉及内部循环时,它仅输出&#39; *&#39;,当模数为0时,所有其他时间输出&#39; &#39;

为什么会这样做?

另外,不了解第一行。以下是做什么的?

var res = '\n', i, j;  

将变量res分配给3个值的目的是什么。

在控制台中,没有这条线就可以正常工作。

2 个答案:

答案 0 :(得分:1)

var res = '\n', i, j;  

这是三个变量,以一种令人困惑的方式写下来:

var res = '\n'; // newline
var i;
var j;

在一行中:

var i, j, res = '\n';  

脚本运行正常。我用短划线替换了空格,这就是结果:

-------*-------
---*---*---*---
-------*-------
-*-*-*-*-*-*-*-
-------*-------
---*---*---*---
-------*-------

如果i=1j=i,则i*j%8不为0,因此为真,这会导致破折号。第一行,你看到7个破折号,然后是*等等。​​

答案 1 :(得分:0)

它将所有乘法从1 * 1运行到1 * 14一直到6 * 1到6 * 14。正如您已经指出的那样,只有当所述乘法的模数为零时,它才会向*字符串添加res。在1到14的范围内,唯一的时间是8。

您可以在内部块中添加一些内容,以便可视化并帮助您理解。一个例子是:

console.log("i:", i, " j:", j, " multiplication:", i*j, "mod8:", (i*j)%8)

作为一个完整的例子,这将是这样的:

var res = '\n', i, j;
for (i = 1; i <= 7; i++) {                
    for (j = 1; j <= 15; j++) {
        res += (i * j) % 8 ? ' ' : '*';
        console.log("i:", i, " j:", j, " multiplication:", i*j, "mod8:", (i*j)%8)
    }
    res += '\n';
}
alert(res);