为什么 console.log() 不连接字符串?

Why doesn't console.log() concatenate strings?

在此示例中,我尝试在第一行打印一个星号,在第二行打印两个星号,依此类推:

var n = 5;
for (i = 0; i < n; i++) {
  for (j = 0; j < i; j++) {
    console.log('*');
  }
  console.log('\r\n');
}

输出应如下所示:

*
**
***
****
*****

但是在 Chrome 控制台中我看到了这个:

*
2 *
3 *
4 *
5 *

这是为什么?

因为这基本上就是它的工作方式。每次调用 console.log 都会输出一个新的日志条目。每个日志条目都在其自己的行中。

如果多次记录同一个字符串,它们将被汇总到一个条目中,计数在前。

不要将 console.log 与 C# 或类似语言中的 Console.Write 搞错。更像是 Console.WriteLine.

console.log 并非旨在精确控制输出的渲染。它是一个日志编写器,而不是终端布局API。

它将每条日志消息单独占一行,并将重复的、连续的日志消息折叠成一条消息,并在其旁边记录出现的次数。

之所以这样做,是因为为了清楚起见,开发工具就是这样处理同一值多次出现的。

您可以使用数组来实现您想要的效果。另请注意,我们将 j<i 更改为 j<= 以便它在 5 日输出。

然后,我们使用.join('')方法将数组展平为字符串。

此外,由于我们在每个 迭代 循环中 console.logging,因此将自动添加一个新行,因为它是一个日志 per循环。

var n = 5;
for (i = 0; i < n; i++) {
  var arr = [];
  for (j = 0; j <= i; j++) {

    arr.push('*');

  }
  console.log(arr.join(''));
}

请注意,如果您将其打印到 DOM 中,则不需要数组 - 它会按照您最初的预期工作。

更新: Ivar 也做了一个很好的解决方案,那就是使用 String.repeat() 函数,只需要你使用一个循环。

var n = 5;
for (i = 1; i <= n; i++) {
  var str = '*';
  str = str.repeat(i);
  console.log(str);
}