【问题标题】:What is [] + [] in javascriptjavascript中的[]+[]是什么
【发布时间】:2012-02-19 17:21:04
【问题描述】:

[]+[]、[]+{}、{}+[]、{}+{}的值是多少?怎么做?

这是我的控制台日志

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

还有

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

赋值时值如何变化?

SRC:video

【问题讨论】:

  • 这些只是警告,没有任何设计原因

标签: javascript


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • {} + [] 我猜{} 被解释为一个空块语句,所以+ 被解释为 unary 版本,所以你'剩下+[],它对数组进行toNumber转换(通过toString转换)
    • 我是正确的;例如{alert(1)} 会提醒而不是抛出 missing :
    猜你喜欢
    • 1970-01-01
    • 2017-03-15
    • 1970-01-01
    • 2014-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多