为什么在某些情况下 console.log 会记录带引号的字符串?

Lon*_*ner 5 javascript types google-chrome node.js

我正在运行 Node.js v10.5.0 的这些示例。当我只用它打印字符串时,它打印的字符串不带引号。

> console.log('foo', 'bar')
foo bar
undefined
Run Code Online (Sandbox Code Playgroud)

但是当我一起打印字符串和数字时,它会打印带有引号的字符串。

> console.log(1, 'foo', 'bar')
1 'foo' 'bar'
undefined
Run Code Online (Sandbox Code Playgroud)

为什么会出现这种差异呢?我期望它在第二个示例中打印以下内容:

1 foo bar
Run Code Online (Sandbox Code Playgroud)

在 Chrome 70 中也可以观察到类似的行为。

当存在数字类型的参数时,看起来像是console.log()选择在引号中显示字符串,但是即使涉及数字,这些示例也会打印不带引号的所有字符串:

> console.log('foo', 'bar', 1)
foo bar 1
undefined
> console.log('foo', 1, 'bar')
foo 1 bar
undefined
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?为什么console.log()在某些情况下打印带引号的字符串,而在其他情况下则不打印?

Ale*_*x W 2

目前还没有合法的标准,console.log但大多数浏览器,包括 Chrome(即 Chromium),都使用工作组规范(WHATWG)

\n\n

https://console.spec.whatwg.org/#logger

\n\n

根据此规范,如果您有不同数量的参数,则根据当前规范,将使用不同的方法来输出数据:

\n\n

2.1 记录器(logLevel, args)

\n\n
    \n
  1. 如果args为空,则返回。

  2. \n
  3. 首先是.args[0]

  4. \n
  5. 剩余元素为 args 中第一个元素。

  6. \n
  7. 如果rest为空,则执行Printer(logLevel, \xc2\xab first \xc2\xbb)并返回。

  8. \n
  9. 如果first不包含任何格式说明符,则执行\n Printer(logLevel, args)

  10. \n
  11. 否则,执行Printer(logLevel, Formatter(args)).

  12. \n
  13. 返回undefined

  14. \n
\n\n

最终,参数的数量决定了用于输出信息的方法。具体来说,在您的示例中,第一个参数不能包含格式说明符,因为它是一个数字,因此它会传递给Printer(),但如果第一个参数是字符串,那么它会传递给Formatter()

\n\n

因此,根据顺序您会得到不同的输出:

\n\n
> console.log(\'hello\',1,\'hello\')\nhello 1 hello\n
Run Code Online (Sandbox Code Playgroud)\n\n

相对

\n\n
> console.log(1,\'hello\',\'hello\')\n1 "hello" "hello"\n
Run Code Online (Sandbox Code Playgroud)\n\n

最终,这些方法如何输出信息取决于实现/浏览器:

\n\n
\n

实现如何打印 args 取决于实现,但是实现应该用空格或类似的东西分隔对象,因为这已成为开发人员的期望。

\n
\n