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

时间:2018-12-12 16:03:40

标签: javascript node.js google-chrome types

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

> console.log('foo', 'bar')
foo bar
undefined

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

> console.log(1, 'foo', 'bar')
1 'foo' 'bar'
undefined

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

1 foo bar

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

当存在数字类型的参数时,console.log()似乎选择用引号显示字符串,但是即使在涉及数字的情况下,这些示例也会打印所有不带引号的字符串:

> console.log('foo', 'bar', 1)
foo bar 1
undefined
> console.log('foo', 1, 'bar')
foo 1 bar
undefined

这是怎么回事?为什么在某些情况下console.log()打印带有引号的字符串,而在其他情况下却不打印?

2 个答案:

答案 0 :(得分:3)

这似乎是Chrome小组的故意选择。没有console.log在不同环境中如何工作的标准。

答案 1 :(得分:2)

console.log尚无合法标准,但大多数浏览器(包括Chrome(即Chromium))都使用working group specification (WHATWG)

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

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

2.1 Logger(logLevel,args)

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

  2. 第一args[0]

  3. rest 成为所有在args中紧随其后的元素。

  4. 如果 rest 为空,请执行Printer(logLevel, « first »)并返回。

  5. 如果 first 不包含任何格式说明符,请执行 Printer(logLevel, args)

  6. 否则,执行Printer(logLevel, Formatter(args))

  7. 返回undefined

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

因此,您将获得不同的输出,具体取决于订单:

> console.log('hello',1,'hello')
hello 1 hello

> console.log(1,'hello','hello')
1 "hello" "hello"

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

  

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