Javascript Can';我无法解释这些结果

Javascript Can';我无法解释这些结果,javascript,Javascript,有人能给我解释一下为什么会有这些结果吗 我知道这不是一个真正的问题,但我很想知道 谢谢这是因为+是用来添加数字和字符串的,它也是。这也是因为{}既是一个空对象又是一个空对象 我可以解释这一点 [] + {} 两者都转换为字符串 [].toString() + {}.toString() [].toString()与[].join(“”),和{}.toString()是'[object object]',所以第一个是[object object] 第二个更令人困惑 {} + [] 此处的{

有人能给我解释一下为什么会有这些结果吗

我知道这不是一个真正的问题,但我很想知道


谢谢

这是因为+是用来添加数字和字符串的,它也是。这也是因为
{}
既是一个空对象又是一个空对象

我可以解释这一点

[] + {}
两者都转换为字符串

[].toString() + {}.toString()
[].toString()
[].join(“”)
,和
{}.toString()
'[object object]'
,所以第一个是
[object object]

第二个更令人困惑

{} + []
此处的
{}
不会被解释为对象,而是被解释为空块。所以里面的代码是运行的。里面什么都没有,所以它什么也不做,然后运行下一条语句:
+[]
。这将数组转换为int,int首先将数组转换为字符串,而不是字符串

{} + [] => +[] => +([].toString()) => 0
如果将
{}
放在括号中,它将与第一个相同

({}) + [] => '[object Object]'
来自,与

  • []+[]
    使用加法运算符时,左操作数和右操作数都将首先转换为基本体()。根据 将对象(在本例中为数组)转换为基元将返回 它的默认值,用于具有有效
    toString()方法的对象
    是调用
    对象.toString()的结果。对于
    数组这与调用
    array.join()
    ([§15.4.4.2][4])相同。 连接一个空数组会导致一个空字符串,所以 加法运算符返回两个空字符串的串联, 这是空字符串

  • []+{}
    []+[]
    类似,两个操作数都首先转换为原语。对于“对象对象”(§15.2),这也是 调用
    object.toString()
    ,该函数用于非null、非未定义的对象 是
    “[对象]”
    ([§15.2.4.2][5])

  • {}+[]
    这里的
    {}
    不是作为一个对象来解析的,而是作为一个空块([§12.1][6]),至少只要您没有强制这样做 语句是一个表达式,但稍后将详细介绍)。回归 空块的值为空,因此该语句的结果为 与
    +[]
    相同。一元
    +
    运算符([§11.4.6][7])返回
    ToNumber(ToPrimitive(操作数))
    。我们已经知道,,
    ToPrimitive([])
    是空字符串,根据[§9.3.1][8],
    ToNumber(“”)
    为0

  • {}+{}
    与前一种情况类似,第一个
    {}
    被解析为返回值为空的块。同样,
    +{}
    ToNumber(ToPrimitive({}))
    ,而
    ToPrimitive({})
    “[object]
    对象]”
    (请参见
    []+{}
    )。所以要得到
    +{}
    的结果,我们必须 在字符串
    “[对象]”
    上应用
    ToNumber
    。当遵循 根据[§9.3.1][9]中的步骤,我们得到
    NaN
    ,结果如下:

    如果语法无法将字符串解释为StringNumericLiteral的扩展,则[ToNumber][10]的结果为NaN

  • 数组(16)。加入(“wat”-1)
    根据[§15.4.1.1][11]和[§15.4.2.2][12],
    数组(16)
    创建长度为16的新数组。要获取要联接的参数的值, [§11.6.2][13]第5步和第6步表明,我们必须将两者都转换 使用
    ToNumber
    将操作数转换为数字
    ToNumber(1)
    仅为1 ([§9.3][14]),而根据 [§9.3.1][15]. 遵循[§11.6.2][16]、§11.6.3][17]的第7步 规定

    如果任一操作数为NaN,则结果为NaN

    因此
    Array(16.join)的参数是
    NaN
    。根据§15.4.4.5(
    Array.prototype.join
    ),我们必须调用参数上的
    ToString
    , 这是
    “NaN”
    ([§9.8.1][18]):

    如果m是NaN,则返回字符串
    “NaN”

    在[§15.4.4.5][19]的步骤10之后,我们得到了15次重复的
    “NaN”
    和空字符串的串联,这等于结果 你看到了。当使用
    “wat”+1
    而不是
    “wat”-1
    作为 参数,加法运算符将
    1
    转换为字符串,而不是 将“wat”
    转换成一个数字,这样它就可以有效地调用
    数组(16)。加入(“wat1”)


  • 你具体想知道什么?有一个数组一个对象一个对象转换成字符串,一个对象和一个数组后跟0…?@Precastic-大概是为什么它不是可交换的,以及用于
    +
    @scrasedcola的逻辑我不知道你是如何在谷歌上搜索
    []+{}
    :)@scrasedcola它仍然没有解释第一个示例的行为。虽然它几乎没有回答第二个例子,但整个问题是处理
    typeof
    ,以及这对操作的影响。那可不是复制品