当前位置: 首页 > 面试题库 >

为什么++ [[]] [+ []] + [+ []]返回字符串“ 10”?

顾昌翰
2023-03-14
问题内容

这是有效的,并返回"10"JavaScript中的字符串

console.log(++[[]][+[]]+[+[]])

为什么?这是怎么回事


问题答案:

如果我们将其拆分,则混乱等于:

++[[]][+[]]
+
[+[]]

在JavaScript中,确实是这样+[]===0+将某物转换为数字,在这种情况下,它将降为+""0(请参见下面的规范详细信息)。

因此,我们可以简化它(++优先于+):

++[[]][0]
+
[0]

因为[[]][0]意思是:从中获取第一个元素[[]],所以确实:

[[]][0]返回内部数组([])。由于引用,说错了[[]][0]===[],但是让我们调用内部数组A以避免错误的表示法。
++在其操作数之前表示“加1并返回加结果”。因此++[[]][0]等于Number(A) + 1(或+A + 1)。

同样,我们可以将混乱简化为更清晰的内容。让我们替换[]A

(+[] + 1)
+
[0]

+[]将数组强制转换为number之前0,需要先将其强制转换为字符串,即""再次。最后1添加,结果为1

  • (+[] + 1) === (+"" + 1)
  • (+"" + 1) === (0 + 1)
  • (0 + 1) === 1

让我们进一步简化一下:

1
+
[0]

同样,在JavaScript:中也是如此[0]=="0",因为它是将一个元素与一个数组连接在一起。连接将连接由分隔的元素,。使用一个元素,您可以推断出此逻辑将导致第一个元素本身。

在这种情况下,+将看到两个操作数:一个数字和一个数组。现在,它试图将两者强制转换为同一类型。首先,将数组强制转换为字符串"0",然后将数字强制转换为字符串("1")。
Number+字符串===String

"1" + "0" === "10" // Yay!

规格详细信息+[]

+[]真是一个迷宫,但要做到这一点,首先要将其转换为字符串,因为这是这样+说的:

11.4.6一元+运算符

一元+运算符将其操作数转换为Number类型。

产生UnaryExpression:+ UnaryExpression的评估如下:

  1. 令expr为评估UnaryExpression的结果。

  2. 返回ToNumber(GetValue(expr))。

ToNumber() 说:

宾语

应用以下步骤:

  1. 令primValue为ToPrimitive(输入参数,提示字符串)。

  2. 返回ToString(primValue)。

ToPrimitive() 说:

宾语

返回对象的默认值。通过调用对象的[[DefaultValue]]内部方法并传递可选提示PreferredType来检索对象的默认值。本规范为8.12.8中的所有本机ECMAScript对象定义了[[DefaultValue]]内部方法的行为。

[[DefaultValue]] 说:

8.12.8 [[DefaultValue]](提示)

使用提示字符串调用O的[[DefaultValue]]内部方法时,将执行以下步骤:

  1. 令toString为使用参数“ toString”调用对象O的[[Get]]内部方法的结果。

  2. 如果IsCallable(toString)为true,

一个。令str为调用toString的[[Call]]内部方法的结果,其中O为this值,并且参数列表为空。

b。如果str是原始值,则返回str。

.toString数组的说:

15.4.4.2 Array.prototype.toString()

调用toString方法时,将执行以下步骤:

  1. 令array为在this值上调用ToObject的结果。

  2. 令func为使用参数“ join”调用array的[[Get]]内部方法的结果。

3.
如果IsCallable(func)为false,则将func设为标准的内置方法Object.prototype.toString(15.2.4.2)。

  1. 返回调用func提供数组的[[Call]]内部方法的结果作为this值和空参数列表。

所以+[]归结为+"",因为[].join() === ""

同样,+定义为:

11.4.6一元+运算符

一元+运算符将其操作数转换为Number类型。

产生UnaryExpression:+ UnaryExpression的评估如下:

  1. 令expr为评估UnaryExpression的结果。

  2. 返回ToNumber(GetValue(expr))。

ToNumber被定义为""

StringNumericLiteral ::: [空]的MV为0。

如此+"" === 0,如此+[] === 0



 类似资料:
  • 问题内容: 我有一个带有3个嵌套数组的简单php结构。 我不使用特定的对象,而是使用2个嵌套循环构建数组。 这是我要转换为Json的数组的var_dump的示例。 在另一个脚本中,我具有类似的结构并且工作正常。所以我不明白为什么在这里不起作用。 编辑:似乎有编码问题。当返回ASCII,该作品但当它返回UTF8,它不工作了。 Edit2:返回表示:格式错误的UTF-8字符,可能编码不正确。 问题答案

  • 问题内容: 这可能是最简单的事情之一,但我看不到自己在做错什么。 我的输入包括一个带有数字的第一行(要读取的行数),一串包含数据的行和最后一行仅包含\ n的行。我应该处理此输入,并在最后一行之后做一些工作。 我有这个输入: 对于读取输入,我有以下代码。 我的问题是为什么我什么都不打印?程序读取第一行,然后不执行任何操作。 问题答案: 不读取以下换行符,因此第一个(返回 当前 行的其余部分 )将始终

  • 为什么返回而不是像或这样的较小类型?我的理解是,这个方法只返回-1、0或1。 第二部分,如果我要设计一个比较方法来比较两个类型的对象,并且我只想返回-1、0或1,那么使用或通常是个好主意吗? 编辑:我已经更正,不返回-1,0或1,它实际上返回一个值 答案似乎大致是,没有理由返回小于的类型,因为返回值是右值,而这些右值不会受益于小于int类型(4字节)。此外,许多人指出,大多数系统的寄存器可能会有大

  • 问题内容: 在oracles 网站上的Java API中:“ compareTo返回:”如果参数字符串等于此字符串,则值为0;否则为0。如果此字符串在字典上小于字符串参数,则小于0的值;如果该字符串在字典上大于字符串参数,则该值大于0。 这是一个if语句: 由于字符串a在字典上较大,因此返回true。 我的问题是,compareTo总是返回0、1或-1吗?还是返回字符串大于或小于字符串参数的实际

  • 问题内容: 为什么要得到一个空字符串?我的代码是: 此代码警报,但我想得到,我怎么了?谁能帮我? 更新 我更改了CSS函数,现在可以正常使用了: 问题答案: 该属性用于获取直接放置在元素上的样式。它不会从样式表中计算样式。

  • 这可能是最简单的事情之一,但我没有看到我做错了什么。 我的输入包括第一行带有数字(要读取的行数),一堆带有数据的行和最后一行只带有\n。我应该处理这个输入,在最后一行之后,做一些工作。 我有这样的意见: 为了读取输入,我有以下代码。 我的问题是为什么我不打印任何东西?程序读取第一行,然后什么也不做。