使用数组添加对象的问题

Der*_*會功夫 12 javascript

受此视频的启发,我进一步测试了{}+[].

测试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

类型{}+[]可能因环境而异.

  1. typeof {}+[] //"object"
    根据运算符优先级,在这种情况下typeof {}求值为"object",+[]添加一个空字符串(数组被强制转换为字符串),因此结果为"object".
    你可以考虑检查typeof ({}+[])(你的第二个案例).

  2. var crazy = {}+[]; typeof crazy //"string"
    在这种情况下,您正在添加对象和数组 - 它们都强制转换为字符串,因此typeof返回"string".

  3. {}+[]
    这被解释为一个空的代码块,一元加和空数组.第一部分什么都不做,数组转换为逗号分隔的字符串(空数组为空数组),然后转换为数字(空字符串转换为0),因此0.

更新

  • {}+[] === "" //false
    看到#3,{}被解释为一个块,你0在左边.
    比较{}+[] === 0 // true.

  • ({}+[]) === "" //false
    见#1,{}被解释为对象文字.在尝试添加数组和对象时,它们都转换为字符串,"[object Object]"对象为对象,对数组为空字符串.因此,你"[object Object]"在左边.
    比较({}+[]) === "[object Object]" // true.

  • ({};+[]) === "" //SyntaxError
    我猜,这个是不言自明的:)

  • ({}+[]).length //15
    15正是长度"[object Object]",见上文.

  • @Derek:因为`+""`是'0`.@ Li0liQ:顺便说一句,字符串*不*转换为等于字符串长度的数字.`+"abc"`返回`NaN`.一元加上如何转换字符串在规范中定义. (4认同)