无法解释这些结果

Maj*_*ssi 11 javascript

有人可以向我解释为什么这些结果?

在此输入图像描述

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

谢谢

Roc*_*mat 11

这是因为+它意味着添加数字和字符串,它也是一元运算符.这也是因为{}它既是空对象又是块语句.

我可以解释一下.

[] + {}
Run Code Online (Sandbox Code Playgroud)

两者都转换为字符串.

[].toString() + {}.toString()
Run Code Online (Sandbox Code Playgroud)

[].toString()是一样的[].join(''),并且{}.toString()'[object Object]'的,所以第一个是[object Object].

第二个更令人困惑.

{} + []
Run Code Online (Sandbox Code Playgroud)

{}这里解释为对象,被解释为一个空块.所以里面的代码是运行的.内部没有任何东西,所以它什么也没做,然后下一个语句运行: +[].这会将数组转换为int,然后首先将其转换为字符串而不是字符串.

{} + [] => +[] => +([].toString()) => 0
Run Code Online (Sandbox Code Playgroud)

如果你把{}括号括起来,那就和第一个一样.

({}) + [] => '[object Object]'
Run Code Online (Sandbox Code Playgroud)


nic*_*elo 6

这里开始,与相关

  1. [] + []

    使用加法运算符时,左右操作数首先转换为基元(第11.6.1节).根据§9.1,将对象(在本例中为数组)转换为基元会返回其默认值,对于具有有效toString()方法的对象,该默认值是调用的结果object.toString()(第8.12.8节).对于数组,这与调用array.join()([§15.4.4.2] [4])相同.连接空数组会产生一个空字符串,因此加法运算符的第7步返回两个空字符串的串联,即空字符串.

  2. [] + {}

    类似于[] + [],两个操作数首先被转换为基元.对于"对象对象"(第15.2节),这又是调用的结果object.toString(),对于非空的,未定义的对象是"[object Object]"([§15.2.4.2] [5]).

  3. {} + []

    {}这里不会被解析为一个对象,而是作为一个空块([§12.1] [6],只要你不逼这种说法至少是一个表达式,但稍后详细说明).空块的返回值为空,因此该语句的结果与之相同+[].一元运算+符([§11.4.6] [7])返回 ToNumber(ToPrimitive(operand)).我们已经知道, ToPrimitive([])是空字符串,根据[§9.3.1] [8], ToNumber("")是0.

  4. {} + {}

    与前一种情况类似,第一种情况{}被解析为具有空返回值的块.再次,+{}是一样的 ToNumber(ToPrimitive({})),和ToPrimitive({})"[object Object]"(见[] + {}).所以为了获得结果+{},我们必须ToNumber在字符串上应用"[object Object]".当遵循[§9.3.1] [9]中的步骤时,我们得到NaN结果:

    如果语法不能将String解释为StringNumericLiteral的扩展,那么[ToNumber] [10]的结果是NaN.

  5. Array(16).join("wat" - 1)

    根据[§15.4.1.1] [11]和[§15.4.2.2] [12],Array(16)创建一个长度为16的新数组.要获取要加入的参数的值,[§11.6.2] [13]步骤#5和#6表明我们必须使用将两个操作数转换为数字ToNumber.ToNumber(1)简单地说是1([§9.3] [14]),而根据[§9.3.1] [15] ToNumber("wat")再次NaN.在[§11.6.2] [16]的第7步之后,[§11.6.3] [17]规定了这一点

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

    所以论证Array(16).joinNaN.遵循§15.4.4.5(Array.prototype.join),我们必须调用ToString参数,即"NaN"([§9.8.1] [18]):

    如果mNaN,则返回String "NaN".

    在[§15.4.4.5] [19]的第10步之后,我们得到15个重复的连接"NaN"和空字符串,这等于你看到的结果.当使用"wat" + 1而不是"wat" - 1作为参数时,加法运算符转换1为字符串而不是转换"wat"为数字,因此它有效地调用 Array(16).join("wat1").