【问题标题】:Can't explain these results [duplicate]无法解释这些结果[重复]
【发布时间】:2013-06-17 17:23:14
【问题描述】:

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

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

谢谢

【问题讨论】:

  • 您具体想知道什么?有一个数组一个对象一个对象转换成字符串,一个对象和一个数组后跟0...?
  • @Precastic - 大概是为什么它不是可交换的以及用于+的逻辑
  • @scrappedcola 我不知道你是怎么用谷歌搜索到的[] + {} :)
  • @scrappedcola 它仍然没有解释第一个示例的行为。尽管它几乎回答了第二个例子,但整个事情都是在处理typeof 以及它如何影响操作。这远非重复

标签: javascript


【解决方案1】:

这是因为+ 用于添加数字和字符串,所以它也是unary operator。这也是因为{}既是一个空对象又是一个block statement

我可以解释一下。

[] + {}

两者都转换为字符串。

[].toString() + {}.toString()

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

第二个比较混乱。

{} + []

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

{} + [] => +[] => +([].toString()) => 0

如果你把{}放在括号里,那就和第一个一样。

({}) + [] => '[object Object]'

【讨论】:

    【解决方案2】:

    来自here,与this相关

    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],至少只要你不强迫它 statement 是一个表达式,但稍后会详细介绍)。回报 空块的值为空,因此该语句的结果是 与+[] 相同。一元 + 运算符 ([§11.4.6][7]) 返回 ToNumber(ToPrimitive(operand))。正如我们已经知道的那样, ToPrimitive([]) 是空字符串,根据 [§9.3.1][8], ToNumber("") 为 0。

    4. {} + {}

      与前一种情况类似,第一个{}被解析为一个返回值为空的块。同样,+{}ToNumber(ToPrimitive({})),而ToPrimitive({})"[object Object]"(请参阅[] + {})。所以要得到+{}的结果,我们必须 在字符串"[object Object]" 上应用ToNumber。当遵循 从 [§9.3.1][9] 开始,我们得到 NaN 结果:

      如果语法不能将字符串解释为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]),而 ToNumber("wat") 又是 NaN [§9.3.1][15]。按照 [§11.6.2][16] 的第 7 步,[§11.6.3][17] 规定

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

      所以Array(16).join 的参数是NaN。按照 §15.4.4.5 (Array.prototype.join),我们必须在参数上调用 ToString, 这是"NaN"([§9.8.1][18]):

      如果 mNaN,则返回字符串 "NaN"

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-21
      • 2011-07-12
      • 2014-12-09
      • 2013-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多