[] + [],[] + {},{} + [],{} + {}的值是多少?怎么样?
这是我的控制台日志
>{} + {}
>NaN
>[] + []
>''
>{} + []
>0
>[] + {}
>[Object object]
另外
>var a = [] + {}
>a
>[Object object]
>var b = {} + []
>b
>[Object object]
作业的价值如何变化?
SRC:video
答案 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]"
。