什么是javascript中的[] + []

时间:2012-01-26 16:07:09

标签: javascript

[] + [],[] + {},{} + [],{} + {}的值是多少?怎么样?

这是我的控制台日志

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

另外

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

作业的价值如何变化?

SRC:video

2 个答案:

答案 0 :(得分:11)

{} + []的区别在于,当您执行赋值时,它会在表达式上下文中进行解析,但是当您自己键入它时,它会被解析为语句

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,其连接为“[object object] “也是。

//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

答案 1 :(得分:4)

+运算符连接字符串。所以它试图将对象和数组转换为字符串。

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

编辑:我无法解释为什么{} + []0,为什么({}) + []"[object Object]"