这是有效的,并返回"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的评估如下:
令expr为评估UnaryExpression的结果。
返回ToNumber(GetValue(expr))。
ToNumber()
说:
宾语
应用以下步骤:
令primValue为ToPrimitive(输入参数,提示字符串)。
返回ToString(primValue)。
ToPrimitive()
说:
宾语
返回对象的默认值。通过调用对象的[[DefaultValue]]内部方法并传递可选提示PreferredType来检索对象的默认值。本规范为8.12.8中的所有本机ECMAScript对象定义了[[DefaultValue]]内部方法的行为。
[[DefaultValue]]
说:
8.12.8 [[DefaultValue]](提示)
使用提示字符串调用O的[[DefaultValue]]内部方法时,将执行以下步骤:
令toString为使用参数“ toString”调用对象O的[[Get]]内部方法的结果。
如果IsCallable(toString)为true,
一个。令str为调用toString的[[Call]]内部方法的结果,其中O为this值,并且参数列表为空。
b。如果str是原始值,则返回str。
该.toString
数组的说:
15.4.4.2 Array.prototype.toString()
调用toString方法时,将执行以下步骤:
令array为在this值上调用ToObject的结果。
令func为使用参数“ join”调用array的[[Get]]内部方法的结果。
3.
如果IsCallable(func)为false,则将func设为标准的内置方法Object.prototype.toString(15.2.4.2)。
所以+[]
归结为+""
,因为[].join() === ""
。
同样,+
定义为:
11.4.6一元+运算符
一元+运算符将其操作数转换为Number类型。
产生UnaryExpression:+ UnaryExpression的评估如下:
令expr为评估UnaryExpression的结果。
返回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。我应该处理这个输入,在最后一行之后,做一些工作。 我有这样的意见: 为了读取输入,我有以下代码。 我的问题是为什么我不打印任何东西?程序读取第一行,然后什么也不做。