受此视频的启发,我进一步测试了{}+[].
测试1:
typeof {}+[] //"object"
Run Code Online (Sandbox Code Playgroud)
好的,{}+[]也是object.
测试2:
var crazy = {}+[];
typeof crazy //"string"
Run Code Online (Sandbox Code Playgroud)
什么?没有{}+[]是object?为什么string现在呢?
测试3:
console.log({}+[])
Run Code Online (Sandbox Code Playgroud)
我得到了什么:

所以这是一个number!...不?
那究竟是什么类型{}+[]?
对于那些说{}+[]空字符串的人:
{}+[] === "" //false
({}+[]) === "" //false
({};+[]) === "" //SyntaxError
({}+[]).length //15
Run Code Online (Sandbox Code Playgroud)
JavaScript很难理解......
Li0*_*liQ 13
类型{}+[]可能因环境而异.
typeof {}+[] //"object"
根据运算符优先级,在这种情况下typeof {}求值为"object",+[]添加一个空字符串(数组被强制转换为字符串),因此结果为"object".
你可以考虑检查typeof ({}+[])(你的第二个案例).
var crazy = {}+[];
typeof crazy //"string"
在这种情况下,您正在添加对象和数组 - 它们都强制转换为字符串,因此typeof返回"string".
{}+[]
这被解释为一个空的代码块,一元加和空数组.第一部分什么都不做,数组转换为逗号分隔的字符串(空数组为空数组),然后转换为数字(空字符串转换为0),因此0.
更新
{}+[] === "" //false
看到#3,{}被解释为一个块,你0在左边.
比较{}+[] === 0 // true.
({}+[]) === "" //false
见#1,{}被解释为对象文字.在尝试添加数组和对象时,它们都转换为字符串,"[object Object]"对象为对象,对数组为空字符串.因此,你"[object Object]"在左边.
比较({}+[]) === "[object Object]" // true.
({};+[]) === "" //SyntaxError
我猜,这个是不言自明的:)
({}+[]).length //15
15正是长度"[object Object]",见上文.