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()
在某些情况下打印带引号的字符串,而在其他情况下则不打印?
目前还没有合法的标准,console.log
但大多数浏览器,包括 Chrome(即 Chromium),都使用工作组规范(WHATWG):
https://console.spec.whatwg.org/#logger
\n\n根据此规范,如果您有不同数量的参数,则根据当前规范,将使用不同的方法来输出数据:
\n\n2.1 记录器(logLevel, args)
\n\n如果args为空,则返回。
首先是.args[0]
令剩余元素为 args 中第一个元素。
如果rest为空,则执行Printer(logLevel, \xc2\xab first \xc2\xbb)
并返回。
如果first不包含任何格式说明符,则执行\n Printer(logLevel, args)
。
否则,执行Printer(logLevel, Formatter(args))
.
返回undefined
。
最终,参数的数量决定了用于输出信息的方法。具体来说,在您的示例中,第一个参数不能包含格式说明符,因为它是一个数字,因此它会传递给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\n实现如何打印 args 取决于实现,但是实现应该用空格或类似的东西分隔对象,因为这已成为开发人员的期望。
\n