我正在运行这些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()
打印带有引号的字符串,而在其他情况下却不打印?
答案 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)
如果 args 为空,则返回。
第一为args[0]
。
让 rest 成为所有在args中紧随其后的元素。
如果 rest 为空,请执行Printer(logLevel, « first »)
并返回。
如果 first 不包含任何格式说明符,请执行
Printer(logLevel, args)
。
否则,执行Printer(logLevel, Formatter(args))
。
返回undefined
。
最终,参数的数量决定了用于输出信息的方法。具体来说,在您的示例中,第一个参数不能包含格式说明符,因为它是一个数字,因此将其传递给Printer(),但是如果第一个参数是字符串,则它将被传递给Formatter()。
因此,您将获得不同的输出,具体取决于订单:
> console.log('hello',1,'hello')
hello 1 hello
与
> console.log(1,'hello','hello')
1 "hello" "hello"
最终,这些方法如何输出信息取决于实现/浏览器:
实现如何打印args取决于实现,但是 实现应将对象用空格或其他东西隔开 类似,因为这已成为开发人员的期望。