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

2024-01-21

这是有效的并返回字符串"10"在 JavaScript 中(更多例子在这里 http://sla.ckers.org/forum/read.php?24,33349,33405):

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

为什么?这里发生了什么?


如果我们把它分开,混乱程度等于:

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

在 JavaScript 中,确实如此+[] === 0. +将某些内容转换为数字,在本例中它将归结为+"" or 0(请参阅下面的规格详细信息)。

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

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

Because [[]][0]意思是:获取第一个元素[[]],确实如此:

[[]][0]返回内部数组 ([])。由于参考文献的说法是错误的[[]][0] === [],但我们称内部数组为A以避免错误的符号。

++其操作数前面的意思是“加一并返回增加后的结果”。所以++[[]][0]相当于Number(A) + 1 (or +A + 1).

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

(+[] + 1)
+
[0]

Before +[]可以将数组强制转换为数字0,需要先强制转换为字符串,即"", 再次。最后,1添加,结果是1.

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

让我们进一步简化它:

1
+
[0]

另外,在 JavaScript 中也是如此:[0] == "0",因为它将一个数组与一个元素连接起来。连接将连接由 分隔的元素,。对于一个元素,您可以推断出该逻辑将产生第一个元素本身。

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

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

规格详情+[]:

这是一个迷宫,但是要做+[],首先它被转换为字符串,因为这就是+ says:

11.4.6 一元+运算符

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

产生式 UnaryExpression : + UnaryExpression 的计算如下:

  1. 令 expr 为 UnaryExpression 的计算结果。

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

ToNumber() says:

Object

应用以下步骤:

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

  2. 返回 ToString(primValue)。

ToPrimitive() says:

Object

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

[[DefaultValue]] says:

8.12.8 [[默认值]](提示)

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

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

  2. 如果 IsCallable(toString) 为 true 那么,

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

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

The .toString数组 说:

15.4.4.2 Array.prototype.toString()

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

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

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

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

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

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

再次,+定义为:

11.4.6 一元+运算符

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

产生式 UnaryExpression : + UnaryExpression 的计算如下:

  1. 令 expr 为 UnaryExpression 的计算结果。

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

ToNumber定义为"" as:

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

So +"" === 0, 因此+[] === 0.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 ++[[]][+[]]+[+[]] 返回字符串“10”? 的相关文章

随机推荐

  • Python Tkinter,在函数之后销毁顶层

    我正在使用 Tkinter 作为 GUI 使用 python 对一些驱动器进行编程 当我的机器运行时 我想向用户显示一个顶级窗口 其中包含一些信息 该窗口应在函数完成后自行关闭 这是我的最小例子 from Tkinter import im
  • 正则表达式匹配所有美国电话号码格式

    首先 我想说我在这里看到了很多例子 并用谷歌搜索过 但没有找到符合我正在寻找的匹配前 3 名而不低于中间值的所有条件 请让我知道如何将它们全部放在一处 xxx xxxxxxx xxx xxxxxxx xxx xxx xxxx xxx xxx
  • 如何添加在所有 cron 作业之前运行的 pre-hook 和 post-hook 脚本?

    假设我有以下 cron 条目 bin date 现在假设我想要在 cron 作业运行之前和之后运行的脚本 我可以将 cron 条目修改为如下所示 bin prehook bin date bin posthook 或者 如果我想要 preh
  • 让 paulirish 的 Infinite-Scroll 在 iPhone 上运行

    我一直在我的网站上实施 Paul Irish 的无限滚动 它可以在桌面浏览器上运行 但在移动设备 特别是 iPhone 上却不能立即运行 解决方法是稍微放大 这使得滚动事件触发 从而触发无限滚动 另请参阅此处的问题报告 https gith
  • 生成安全的 cookie 令牌以持久存储

    我正在尝试为我的网站创建登录和注册页面 我希望使用 cookie 来跟踪用户会话 但我正在尝试以最正确 最安全的方式实现它 我尝试查看教程和论坛 但其中大多数都已经过时 并且使用人们评论不安全的技术 我知道令牌需要随机生成和加密 因此我发现
  • 我应该在哪里重新实现 QApplication::notify 函数?

    我应该在哪里重新实现 QApplication notify 函数 我的意思是 哪个班级 我自己的类之一或 Qt 类的子类并在那里执行 我需要这个 因为我在从服务器下载文件时收到以下错误 小文件下载正常 但大文件会导致此消息 Qt 捕获了事
  • 实体框架包含OrderBy随机生成重复数据

    当我从数据库中检索项目列表 包括一些子项目 通过 Include 并随机排序时 EF 给出了一个意外的结果 我创建 克隆了附加项目 为了更好地解释自己 我创建了一个小型且简单的 EF Code First 项目来重现该问题 首先 我将为您提
  • 如何在Python中获取文件的修改日期/时间? [复制]

    这个问题在这里已经有答案了 如何在Python中获取文件的修改日期 时间 os path getmtime filepath or os stat filepath st mtime
  • C# 将 ISO-8859-1 字符转换为实体编号

    我似乎不知道如何将 ISO 8859 1 字符 例如 转换为它的实体编号 233 我希望能够采用字符串 例如 Steel D cor 并将其转换为 Steel D 233 cor 假设您不关心 HTML 中特殊的 HTML 编码字符 例如
  • 来自网络的“添加到日历”的 href 不适用于 Android 6.0+ 上的本机谷歌日历应用程序

    我们有一些 href 链接到 ics 文件和谷歌日历等 一切都在网络和 iOS 设备上完美运行 但是 当在 Chrome 中从 Android 6 0 链接到 添加到日历 时 它会自动打开 Google 日历 这是预期的 但随后它只是显示
  • 今天的日期 JSP

    我发现自己正在处理一些旧的 JSP 并且想做一些简单的事情 例如以 dd mm yyyy 格式显示今天的日期 好像没那么简单 到目前为止我已经导入了 java util 我尝试过各种事情 比如 String df new SimpleDat
  • 我可以安全地删除对 .pdb 文件的引用吗?

    我正在使用 ASP NET Core 5 0 因为它刚刚发布不久 今天我注意到一些奇怪的事情 我为我的软件制作了一个安装程序 它会自动过滤掉进入我的发布版本的每个 pdb 文件 一种永远不会引起问题的机制 但是新的 NET 5 0运行时似乎
  • Sharepoint 工作流首次运行时失败,但手动运行时成功

    我们正在使用一个 infopath 表单 提交后应该会触发自定义 NET 工作流程 基本上 表单中的信息用于创建新的共享点站点 我看到发生的情况是 工作流程第一次运行 提交表单后自动运行 工作流程出错 当我在工作流程失败后立即手动运行该工作
  • c/c++ 如何获取.exe运行进程的基地址?

    我正在寻找一个可以用来获取基地址的方法 函数 program exe 03262C08 gt B4895A0 该地址来自作弊引擎 基地址已通过指针扫描器找到 在指针扫描仪中我可以按show module list并且有地址program e
  • 在 Laravel 5 中创建嵌套的类别列表

    我对 Laravel 相当陌生 正在尝试为我的应用程序创建一个树状类别结构 这是我用过很长时间但仍然无法实现我想要的代码 我的控制器 public function index categories Category with childr
  • 如何在 Mac OSX 上安装 ffmpeg 的 libx265

    我尝试过多种指南here https hexeract wordpress com 2009 04 12 how to compile ffmpegmplayer for macosx 搜索 构建 libx265 和here http si
  • 从我的 war 目录提供图像?

    我有一个 servlet 它提供存储在 blob 中的图像文件 如果找不到请求的图像 我想提供一个包含在我的 war 目录中的静态图像 我们如何做到这一点 这就是我从数据存储区提供 blob 图像的方式 public class Servl
  • Highcharts:使用jspdf导出多个图表

    当我尝试使用导出多个 Highcharts 图表时jsPdf我没有以正确的方式获取图表 你能帮我解决这个问题吗 JavaScript 代码 Highcharts chart container title text Solar Employ
  • 在 Java 中断言异常,如何? [复制]

    这个问题在这里已经有答案了 这可能是一个概念上愚蠢的问题 但也可能不是 因为我仍然是一名学生 我想我应该没有问题问 想象一下 您有一个方法 如果给定某些条件 它将抛出 NumberFormatException 我想编写一个单元测试来查看异
  • 为什么 ++[[]][+[]]+[+[]] 返回字符串“10”?

    这是有效的并返回字符串 10 在 JavaScript 中 更多例子在这里 http sla ckers org forum read php 24 33349 33405 console log 为什么 这里发生了什么 如果我们把它分开