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。