gpt4 book ai didi

javascript - 对于 CodeMash 2012 的 'Wat' 演讲中提到的这些奇怪的 JavaScript 行为有何解释?

转载 作者:行者123 更新时间:2023-11-28 09:59:32 25 4
gpt4 key购买 nike

'Wat' talk for CodeMash 2012 基本上指出了 Ruby 和 JavaScript 的一些奇怪的怪癖。

我已经将结果制作为 JSFiddle http://jsfiddle.net/fe479/9/ .

下面列出了 JavaScript 特有的行为(因为我不了解 Ruby)。

我在 JSFiddle 中发现我的一些结果与视频中的结果不符,我不确定为什么。然而,我很好奇 JavaScript 在每种情况下是如何在幕后处理工作的。

Empty Array + Empty Array
[] + []
result:
<Empty String>

我对 JavaScript 中与数组一起使用的 + 运算符感到非常好奇。这与视频的结果相符。

Empty Array + Object
[] + {}
result:
[Object]

这与视频的结果相符。这里发生了什么?为什么这是一个对象。 + 运算符的作用是什么?

Object + Empty Array
{} + []
result:
[Object]

这与视频不符。视频显示结果为 0,而我得到了 [Object]。

Object + Object
{} + {}
result:
[Object][Object]

这也与视频不匹配,输出一个变量如何产生两个对象?也许我的 JSFiddle 是错误的。

Array(16).join("wat" - 1)
result:
NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN

执行 wat + 1 会产生 wat1wat1wat1wat1...

我怀疑这只是简单的行为,尝试从字符串中减去数字会导致 NaN。

最佳答案

以下是对您所看到(以及应该看到)的结果的解释列表。我使用的引用来自 ECMA-262 standard

  1. [] + []

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

  2. [] + {}

    [] + []类似,两个操作数都首先转换为基元。对于“Object 对象”(第 15.2 节),这又是调用 object.toString() 的结果,对于非 null、非 undefined object 是 “[object Object]” (§15.2.4.2)。

  3. {} + []

    此处的 {} 不会解析为对象,而是解析为空 block ( §12.1 ,至少只要您不强制该语句为表达式,但更多关于稍后)。空 block 的返回值为空,因此该语句的结果与+[]相同。一元 + 运算符 ( §11.4.6 ) 返回 ToNumber(ToPrimitive(operand))。我们已经知道,ToPrimitive([]) 是空字符串,根据 §9.3.1ToNumber("") 是 0。

  4. {} + {}

    与之前的情况类似,第一个 {} 被解析为返回值为空的 block 。同样,+{}ToNumber(ToPrimitive({})) 相同,而 ToPrimitive({})"[对象对象]”(请参阅[] + {})。因此,要获得 +{} 的结果,我们必须对字符串 "[object Object]" 应用 ToNumber。当执行 §9.3.1 中的步骤时,我们得到 NaN 结果:

    If the grammar cannot interpret the String as an expansion of StringNumericLiteral, then the result of ToNumber is NaN.

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

    根据 §15.4.1.1§15.4.2.2Array(16) 创建一个长度为 16 的新数组。要获取要连接的参数的值,§11.6.2 步骤 #5 和 #6 表明我们必须使用 ToNumber 将两个操作数转换为数字。 ToNumber(1) 只是 1 ( §9.3 ),而 ToNumber("wat") 又是 NaN 根据 §9.3.1 。在 §11.6.2 的步骤 7 之后,§11.6.3 指示

    If either operand is NaN, the result is NaN.

    因此 Array(16).join 的参数是 NaN。遵循 §15.4.4.5 (Array.prototype.join),我们必须对参数调用 ToString,即 "NaN" ( §9.8.1 ):

    If m is NaN, return the String "NaN".

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

至于为什么您在 {} + [] 情况下看到不同的结果:当将其用作函数参数时,您将强制语句成为一个ExpressionStatement,这使得无法将 {} 解析为空 block ,因此它被解析为空对象文字。

关于javascript - 对于 CodeMash 2012 的 'Wat' 演讲中提到的这些奇怪的 JavaScript 行为有何解释?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9399805/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com