在当前的Google Chrome v56.0和Safari v9.1中都是如此:
在调试器控制台中,如果我输入:
> console.log(1, typeof 1)
1 "number"
> console.log("1", typeof 1)
1 number
为什么第一个"number"
而第二个number
? (也就是说,为什么第一个被引用但第二个不是?
答案 0 :(得分:0)
看起来它需要调用toString
(在必要的地方)作为将下一部分显示为字符串的模式。
没有引号
console.log("1", typeof 1) 1 number console.log("", typeof 1) 1 number console.log("0", typeof 1) 0 number
带引号
console.log(1, typeof 1) 1 "number" console.log({}, typeof 1) 1 Object {} "number" console.log(false, typeof 1) 1 false "number" console.log(true, typeof 1) 1 true "number" console.log([], typeof 1) 1 [] "number" console.log(() => true, typeof 1) 1 () => true "number" console.log(/./, typeof 1) 1 /./ "number"
答案 1 :(得分:0)
这不仅仅是typeof,与console.log(1, "1");
& console.log("1", "1");
。
我认为它会在那里加上引号,因为当你打印两种不同的类型时,它会为你区分它们。
答案 2 :(得分:0)
如果我们查看MDN上的the console.log页面,它会解释:
obj1 ... objN
要输出的JavaScript对象列表。每个对象的字符串表示形式按列出和输出的顺序附加在一起。
所以在第一个例子中,它组合了一个整数(1
)和一个字符串(typeof 1
)。因为有一个整数,它将两个值组合在一起,然后将它们转换为字符串。所以1
现在等于字符串; 1
和typeof 1
现在等于typeof 1
"number"
的输出字符串。
因此,结果字符串为1 "number"
。
在第二个示例中,1
已经是一个字符串,因此它既不会转换为字符串,也只是简单地将它们连接起来,因此结果如预期的那样; 1 number
。