Javascript 使用数组添加对象时出现问题

Javascript 使用数组添加对象时出现问题,javascript,Javascript,受此启发,我进一步测试了{}+[] 测试1: typeof {}+[] //"object" var crazy = {}+[]; typeof crazy //"string" console.log({}+[]) 好的,{}+[]是一个对象 测试2: typeof {}+[] //"object" var crazy = {}+[]; typeof crazy //"string" console.log({}+[]) 什么?难道{}+[]不是对象吗?为什么现在是字符串

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

测试1:

typeof {}+[]  //"object"
var crazy = {}+[];
typeof crazy  //"string"
console.log({}+[])
好的,
{}+[]
是一个
对象

测试2:

typeof {}+[]  //"object"
var crazy = {}+[];
typeof crazy  //"string"
console.log({}+[])
什么?难道
{}+[]
不是
对象吗?为什么现在是
字符串

测试3:

typeof {}+[]  //"object"
var crazy = {}+[];
typeof crazy  //"string"
console.log({}+[])
我得到的是:

所以它是一个
数字
!。。。没有

那么什么类型的
{}+[]

更新 对于说
{}+[]
是空字符串的人:

{}+[] === ""     //false
({}+[]) === ""   //false
({};+[]) === ""  //SyntaxError
({}+[]).length   //15

JavaScript很难理解…

根据上下文的不同,
{}+[]
的类型可能会有所不同

  • typeof{}+[]/“对象”

    根据运算符优先级,在本例中,{}
  • 的类型计算为“object”,
    +[]
    添加一个空字符串(数组强制为字符串),因此结果为“object”。
    您可以考虑检查
    typeof({}+[])
    (您的第二个案例)

  • var疯狂={}+[];
    疯狂的类型/“字符串”

    在本例中,您正在添加对象和数组-它们都强制为字符串,因此
    typeof
    返回“string”

  • {}+[]

    这被解释为一个空代码块、一元加号和空数组。 第一部分什么都不做,数组被转换成以逗号分隔的元素字符串(空数组为空字符串),然后转换成一个数字(空字符串被转换成0),因此
    0

  • 已更新

    • {}+[]==“false

      参见#3,
      {}
      被解释为一个块,您将在左边看到
      0

      比较
      {}+[]==0//true

    • ({}+[])===“false

      参见#1,
      {}
      被解释为对象文本。当尝试添加数组和对象时,它们都转换为字符串,对象转换为字符串,
      “[object object]”
      ,数组转换为空字符串。因此,您将在左侧看到
      “[对象]”

      比较
      ({}+[])===“[对象]”//true

    • ({};+[])===”“//语法错误

      我想,这是不言自明的:)

    • ({}+[])。长度//15

      15正好是
      “[对象]”
      的长度,请参见上文


    这将记录
    true
    ,因为当您将
    {}+[]
    分配给var时,它会使用它的
    toString()
    方法将其转换为字符串。。。在本例中,它返回“[object object]”(15个字母长,长度=15是从这里开始的)

    我想在test1中,typeof找到第一个参数的type->{},它是一个对象,试试
    typeof({}+[])
    这个,它是字符串。@pcamal,它是数字还是字符串?(认为
    {}+[]
    将是
    对象,因为它们都是。)关于您的更新:
    {}+[]==”
    被评估为
    {}+[] === "";,即空块和
    +[]=”
    <代码>{}+[]==0
    产生
    true
    。JavaScript很难理解:那是因为你模棱两可;)当在
    {}+[]==”
    中遇到
    {}
    时,解析器不知道
    {}
    应该指示对象文本还是块。由于这不在表达式上下文中,
    {}
    被解释为块(默认行为)。括号
    (…)
    强制将求值作为表达式。我刚刚添加了它以指示行
    {}+[]
    被解释为两条语句,而不是一条。但由于JavaScript具有自动插入分号的功能,它实际上可能会这样做。为什么?因为如果某些语法不明确,就必须决定如何解释它。在这种情况下,开发人员决定将
    {}+[]
    解释为
    一元加
    数组
    ,而不是
    对象
    加法运算符
    数组
    。您可能不同意这一点,但事实就是这样:)@Derek:因为
    +“
    0
    @Li0liQ:顺便说一句,字符串不会转换为等于字符串长度的数字<代码>+“abc”
    返回
    NaN
    。规范中定义了一元加号如何转换字符串。是的,控制台中的
    ({}+[])
    将为您提供对象。@Felix Kling感谢您的评论,事实上,数组被转换为逗号分隔的值列表,如果是空数组,则转换为空字符串。空字符串被转换为0。