为{} + []
不同的是,当你做一个任务是在表达方面进行解析,但是当你通过自己键入它解析为一个语句中使用匿名的时候
var b = /*an expression*/
这种区别是明显的功能
//expression
var f = function(){}; //allowed
//statement
function(){}; //not allowed. function statements need a name.
所以在表达方面,我们添加{}
(空对象)和[]
(空列表)与binary +
operator。由于type conversion rules,{}
被转换为字符串"[object Object]"并且[]
被转换为empty string,其串接也是“[对象对象]”。
//parenthesis force an expression
({} + "hello") //"[object Object]hello"
({} + []) //"[object Object]"
({} + [1]) //"[object Object]1"
({} + [1,2]) //"[object Object]1,2"
同时,当我们去掉括号,该{}
解析为一个空的语句块。实际上,它的工作原理就好像我们已经完全承诺完成,留下了一个unary +
operator行事列表。这将其转换为数字。
+[] // 0
{} + [] // 0
+{} // NaN
{} + {} // NaN
{} +"17"// 17
虽然它看起来怪异能够从一个声明(而不是仅仅从表达式)得到一个值,JavaScript标准,确实specify的一份声明中值。在我们的案例中,我们的程序是两个源元素的列表,其最后一个语句为value is given by,expression statement。
在行动中看到的语句完成值的方法是通过EVAL:
eval("{}") //undefined
eval("1") //1
eval("1;2") //2
那些只是需要注意的没有任何设计方面的原因 –