gpt4 book ai didi

javascript - CodeMash 2012 的 'Wat' 演讲中提到的这些奇怪的 JavaScript 行为的解释是什么?

转载 作者:IT老高 更新时间:2023-10-28 11:12:36 25 4
gpt4 key购买 nike

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

我在 http://jsfiddle.net/fe479/9/ 上对结果进行了 JSFiddle .

下面列出了特定于 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. [] + {}

    类似于[] + [],两个操作数都先转换为原语。对于“对象对象”(第 15.2 节),这又是调用 object.toString() 的结果,对于非空、非 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]"(参见 [] + {})。所以要得到 +{} 的结果,我们必须对字符串 "[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 步之后,我们得到 15 次重复的 "NaN" 和空字符串的串联,这等于您看到的结果。当使用 "wat"+ 1 而不是 "wat"- 1 作为参数时,加法运算符将 1 转换为字符串而不是转换 "wat" 到一个数字,所以它有效地调用 Array(16).join("wat1").

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

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

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