以下是对您所看到的结果的解释列表。我使用的参考资料来自ECMA-262标准。
[] + []
使用加法运算符时,左 *** 作数和右 *** 作数都首先转换为基元(第11.6.1节)。按照§9.1的规定,将对象(在这种情况下为数组)转换为基元将返回其默认值,对于具有有效
toString()方法的对象,这是调用的结果
object.toString()(第8.12.8节)。对于数组,这与调用
array.join()(§15.4.4.2)相同。连接一个空数组会导致一个空字符串,因此加法运算符的第7步将返回两个空字符串的串联,即空字符串。
[] + {}
与相似
[] +[],两个 *** 作数都首先转换为基元。对于“对象对象”(第15.2节),这再次是调用的结果
object.toString(),对于非空,非未定义的对象,调用是
"[objectObject]"(第15.2.4.2节)。
{} + []
在
{}这里不会被解析为一个对象,而是作为一个空块(§12.1,至少只要你不逼这种说法是一种表达,但稍后详细说明)。空块的返回值为空,因此该语句的结果与相同
+[]。一元运算
+符(第[11.4.6节)返回
Tonumber(ToPrimitive(operand))。众所周知,
ToPrimitive([])是空字符串,根据9.3.1节,
Tonumber("")为0。
{} + {}
与前一种情况类似,第一种情况
{}被解析为具有空返回值的块。同样,
+{}和相同
Tonumber(ToPrimitive({})),并且
ToPrimitive({})是
"[objectObject]"(请参阅
[] + {})。因此,要获得结果
+{},我们必须
ToNumber在字符串上应用
"[objectObject]"。按照[§9.3.1的步骤进行[ *** 作时,
NaN结果是:
如果语法无法将String解释为 StringNumericLiteral 的扩展,则ToNumber的结果为 NaN 。
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):
如果 m 为 NaN ,则返回String
"NaN"。
在§15.4.4.5的步骤10之后,我们得到了15个重复的串联连接
"NaN"和空字符串,这等于您看到的结果。当使用
"wat"+ 1代替
"wat" -1作为参数时,加法运算符将转换
1为字符串而不是
"wat"数字,因此它有效地调用
Array(16).join("wat1")。
关于为什么看到这种
{} + []情况的不同结果:当将其用作函数参数时,您将强制该语句为 expressionStatement
,这使得无法将其解析
{}为空块,因此将其解析为空对象文字。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)