【发布时间】:2012-04-29 22:15:20
【问题描述】:
受video 的启发,我用{}+[] 测试了进一步。
测试 1:
typeof {}+[] //"object"
好的,所以{}+[] 是object。
测试 2:
var crazy = {}+[];
typeof crazy //"string"
什么? {}+[] 不是 object 吗?为什么现在是string?
测试 3:
console.log({}+[])
我得到了什么:
所以它是number!... 不是吗?
那么{}+[]的类型究竟是什么??
更新
致那些说{}+[] 是空字符串的人:
{}+[] === "" //false
({}+[]) === "" //false
({};+[]) === "" //SyntaxError
({}+[]).length //15
JavaScript 太难理解了...
【问题讨论】:
-
我认为在test1中,typeof找到第一个参数的类型-> {},它是一个对象,试试
typeof ({}+[])这个,它是字符串。 -
@pcamal,那么它是数字还是字符串? (认为
{}+[]会是object,因为它们都是。) -
关于您的更新:
{}+[] === ""被评估为{}; +[] === "";,即空块和+[] === ""。{}+[] === 0产生true。 -
JavaScript 太难理解了:嗯,那是因为你是模棱两可的 ;) 当在
{}+[] === ""中遇到{}时,解析器不知道{}是否应该表示对象字面量或块。由于这不在表达式上下文中,{}被解释为块(默认行为)。括号(...)强制将评估作为表达式。 -
我刚刚添加了这个以表明
{}+[]行被解释为两个语句而不是一个语句。但由于 JavaScript 具有自动分号插入功能,它实际上可能会这样做。为什么?因为如果某些语法不明确,则必须决定如何解释它。在这种情况下,开发人员决定将{}+[]解释为block、unary plus、array,而不是object、addition operator、array。你可能不同意这一点,但事实就是这样:)
标签: javascript