12

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

测试1:

typeof {}+[]  //"object"

好的,{}+[]一个object.

测试 2:

var crazy = {}+[];
typeof crazy  //"string"

什么?不是{}+[]object?为什么是string现在?

测试 3:

console.log({}+[])

我得到了什么:

在此处输入图像描述

所以它是一个number!......不是吗?

那么实际上是什么类型的{}+[]

更新

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

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

JavaScript 太难理解了……

4

2 回答 2

13

类型{}+[]可能因上下文而异。

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

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

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

更新

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

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

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

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

于 2012-04-29T22:22:45.520 回答
0
var f = {}+[];
console.log(f==="[object Object]")

这将记录true,因为当您分配{}+[]给 var 时,它会使用它的方法将其转换为字符串toString()......在这种情况下返回“[object Object]”(长度为 15 个字母 - 并且长度 = 15 是从)

于 2012-04-29T22:40:15.527 回答