2012-01-26 30 views
3

[] + [],[] + {},{} + [],{} + {}的值是什么?如何?什么是javascript中的[] + []

这是我的控制台日志

>{} + {} 
>NaN 
>[] + [] 
>'' 
>{} + [] 
>0 
>[] + {} 
>[Object object] 

而且

>var a = [] + {} 
>a 
>[Object object] 
>var b = {} + [] 
>b 
>[Object object] 

如何做了分配的价值变化?

SRC:video

+1

那些只是需要注意的没有任何设计方面的原因 –

回答

10

{} + []不同的是,当你做一个任务是在表达方面进行解析,但是当你通过自己键入它解析为一个语句中使用匿名的时候

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 byexpression statement

在行动中看到的语句完成值的方法是通过EVAL:

eval("{}") //undefined 
eval("1") //1 
eval("1;2") //2 
4

+操作concats字符串。所以它试图将对象和数组转换为字符串。

{}转换为'[Object object]'[]转换为''

编辑:我不能解释为什么{} + []0和为什么({}) + []"[object Object]"

+4

'{} + []'我猜''''被解释为一个空的块语句,所以'+'被解释为* unary *版本,所以你留下了'+ []',它对数组进行* toNumber *转换*(通过toString转换)*。 – 2012-01-26 16:19:24

+1

am是正确的;例如'{alert(1)}'会提醒而不是抛出'丢失:' –