栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

在CodeMash 2012的“ Wat”演讲中提到的这些怪异JavaScript行为的解释是什么?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

在CodeMash 2012的“ Wat”演讲中提到的这些怪异JavaScript行为的解释是什么?

以下是对您所看到的结果的解释列表。我使用的参考资料来自ECMA-262标准。

  1. [] + []

使用加法运算符时,左操作数和右操作数都首先转换为基元(第11.6.1节)。按照§9.1的规定,将对象(在这种情况下为数组)转换为基元将返回其默认值,对于具有有效

toString()
方法的对象,这是调用的结果
object.toString()
(第8.12.8节)。对于数组,这与调用
array.join()
(§15.4.4.2)相同。连接一个空数组会导致一个空字符串,因此加法运算符的第7步将返回两个空字符串的串联,即空字符串。

  1. [] + {}

与相似

[] +[]
,两个操作数都首先转换为基元。对于“对象对象”(第15.2节),这再次是调用的结果
object.toString()
,对于非空,非未定义的对象,调用是
"[objectObject]"
(第15.2.4.2节)。

  1. {} + []

{}
这里不会被解析为一个对象,而是作为一个空块(§12.1,至少只要你不逼这种说法是一种表达,但稍后详细说明)。空块的返回值为空,因此该语句的结果与相同
+[]
。一元运算
+
符(第[11.4.6节)返回
Tonumber(ToPrimitive(operand))
。众所周知,
ToPrimitive([])
是空字符串,根据9.3.1节,
Tonumber("")
为0。

  1. {} + {}

与前一种情况类似,第一种情况

{}
被解析为具有空返回值的块。同样,
+{}
和相同
Tonumber(ToPrimitive({}))
,并且
ToPrimitive({})
"[objectObject]"
(请参阅
[] + {}
)。因此,要获得结果
+{}
,我们必须
ToNumber
在字符串上应用
"[objectObject]"
。按照[§9.3.1的步骤进行[操作时,
NaN
结果是:

如果语法无法将String解释为 StringNumericLiteral 的扩展,则ToNumber的结果为 NaN

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

根据§15.4.1.1和§15.4.2.2,

Array(16)
创建一个长度为16的新数组。要获取要连接的参数的值,§11.6.2步骤#5和#6显示我们必须将两个操作数都转换为a。使用编号
ToNumber
Tonumber(1)
仅仅是1第9.3节],而
Tonumber("wat")
再次
NaN
按§9.3.1。下面的步骤7§11.6.2,[§11.6.3]决定了

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

因此,的论据

Array(16).join
NaN
。在§15.4.4.5(
Array.prototype.join
)之后,我们必须调用
ToString
参数
"NaN"
(§9.8.1):

如果 mNaN ,则返回String

"NaN"

在§15.4.4.5的步骤10之后,我们得到了15个重复的串联连接

"NaN"
和空字符串,这等于您看到的结果。当使用
"wat"+ 1
代替
"wat" -1
作为参数时,加法运算符将转换
1
为字符串而不是
"wat"
数字,因此它有效地调用
Array(16).join("wat1")

关于为什么看到这种

{} + []
情况的不同结果:当将其用作函数参数时,您将强制该语句为 expressionStatement
,这使得无法将其解析
{}
为空块,因此将其解析为空对象文字。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/432170.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号