javascript - 为什么 {} + [] 在 Javascript 中返回 0?

标签 javascript

<分区>

Possible Duplicate:
What is the explanation for these bizarre JavaScript behaviours mentioned in the 'Wat' talk for CodeMash 2012?

我知道当 [] 被强制转换为字符串时,它会返回空字符串 (""),而当 {} 是强制转换为字符串,它返回 "[object Object]"

当我在浏览器的 Javascript 控制台中运行 [] + {} 时,它按我的预期返回:

>> [] + {}
"[object Object]"

但是当我运行 {} + [] 时,它返回了一个完全出乎意料的值:

>> {} + []
0

可能导致它返回 0 的原因是什么?

最佳答案

当一个语句的开头有一个{时,它会被解释为一个 block ,它可能包含零个或多个语句。一个没有语句的 block 将有一个空的延续值。

换句话说,在这种情况下,{} 被解释为空代码块。

语句在结束大括号 之后结束,这意味着接下来的三个字符 +[] 组成了它们自己的语句。

在表达式或语句的开头,+ 是一元加号运算符,它将其操作数强制转换为数字。

因此 +[]Number([]) 相同,其计算结果为 0

简而言之,{} + [] 是一个空代码块,后跟一个强制转换为数字的数组。


总而言之,如果您在表达式中计算 {} + [] ,它将返回您期望的结果:

>> ({} + []) 
"[object Object]" 

另一件有趣的事情是,您不能以对象文字开始语句,因为解释器会尝试将其解析为语句。这样做

{ "object": "literal" };

会抛出语法错误。

关于javascript - 为什么 {} + [] 在 Javascript 中返回 0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11939044/

相关文章:

javascript - 为什么在 Date 对象上使用 toISOString() 方法,每小时值比原始日期早一个小时?

javascript - 更新返回匹配

javascript - EXT 边框布局 : error when adding panels

javascript - 网址方案 : open windows application on request [Electron]

javascript - 在 javascript 中选择时间 (HH :MM:SS. mmm)

javascript - 如何关闭通过另一个函数的 polyfill 生成的 showModalDialog() ?

javascript - 用于添加/删除 HTML 或 JavaScript 注释的 Textmate 快捷方式

javascript - 是否有可能知道 HTTPRequest 的目标 DOMWindow?

javascript - Jquery 拖放验证

javascript - 页面刷新时本地存储值不会重置