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

(![] + [])[+ []]…解释为何有效

仇龙光
2023-03-14
问题内容
alert((![]+[])[+[]]+(![]+[])[+!+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]);

代码的输出为:fail。为什么?

顺便说一句(![]+[])[+!+[]] == 'false'[1],对吗?但是为什么![]+[] == "false"和为什么+!+[] == 1呢?


问题答案:

正如@Mauricio所评论的(![]+[])[+[]]是“ f”(“ false”的第一个字符),(![]+[])[+!+[]])
a”等,等等。

它是如何工作的?

让我们检查第一个字符“ f”:

(![]+[])[+[]]; // 'f'

表达式的第一部分(括号之间)由组成![]+[],加法运算符的第一个操作数是![],它将产生false,因为数组对象(与任何其他Object实例一样)是
真实的 ,并且应用Logical(!)NOT一元运算符,false例如,它产生值。

![]; // false, it was truthy
!{}; // false, it was truthy
!0;  // true, it was falsey
!NaN;  // true, it was falsey

在它之后,我们有加法运算的第二个操作数,即空数组,[]它仅用于将false值转换为字符串,因为空数组的字符串表示形式只是一个空字符串,它等效于:

false+[]; // "false"
false+''; // "false"

最后一部分,括号后面的一对方括号,它们是属性访问器,它们接收一个表达式,该表达式由再次应用于空数组的Unary Plus运算符形成。

一元加运算符的作用是将类型转换为Number,例如:

typeof +"20"; // "number"

再一次,将其应用于空数组,就像我之前说的,数组的String表示形式是空字符串,当您将空字符串转换为Number时,它会转换为零:

+[]; // 0, because
+[].toString(); // 0, because
+""; // 0

因此,我们可以通过以下步骤将表达式“解码”为:

(![]+[])[+[]];
(false+[])[+[]];
(false+'')[+[]];
(false+'')[0];
('false')[0];  // "f"

请注意,通过在字符串值上使用方括号符号来访问字符不是ECMAScript 3rd的一部分。版本规范(这就是该charAt方法存在的原因)。

但是,这种表示字符串字符的“索引属性”已在ECMAScript
5上进行了标准化,甚至在标准化之前,该功能就已经在许多浏览器中使用(甚至在IE8(标准模式)下)。



 类似资料:
  • 我有一个任务要处理文件https://github.com/mledoze/countries/blob/master/countries.json,这个文件相当大。首先,我用下载了它,并尝试使用0元素: 然而,整个json文件被识别为“str”,而作为0元素,我收到的只是“[”,我该如何修复这个问题呢?

  • 问题内容: 为简单起见,请设想这种情况,我们有一台2位计算机,它具有一对称为r1和r2的2位寄存器,并且仅适用于立即寻址。 假设位序列 00 表示 添加 到我们的CPU中。也 01 的装置将数据移动到R 1和 10组 的装置将数据移动到R2。 因此,这台计算机和一个汇编器都有一种汇编语言,其中的示例代码将像 简而言之,当我将此代码汇编成本地语言时,文件将类似于: 上面的12位是以下代码的本机代码:

  • 问题内容: 有两种通过play框架创建海关标签的方法。 通过在app / view / tags中定义一个Groovy模板 通过在类中直接扩展FastTag直接在纯Java中 没有最新的文件。 问题答案: 因此,类似于JavaExtensions通过扩展JavaExtensions类的工作方式,要创建FastTag,您需要创建一个扩展FastTags的类。您要作为标记执行的每个方法都必须符合以下方

  • 问了这个问题后,我很困惑,于是决定为一个C编译器程序构建类似的测试。这是我的代码: 使用选项在GCC下编译 测试代码被更改,这样错误值只能在运行时知道(而不能在编译时知道),这样GCC优化器就不能删除循环的代码。 我们应该期待CPU的加速吗?(正如GCC编译程序预测的那样)

  • 关于如何将SpringWebFlux Websocket作为注释的问题,请回答。 我正在从事一个Springboot Webflux Websocket项目,该项目处理restful api和Websocket。 要强调的是,这是一个单独的Spring网络流量项目。不是一个Springboot启动WebSocket,不是一个Springboot rSocket,不是一个Springboot酒吧子。

  • 问题内容: 我们天真地决定,我们应该将许多库从两年的1.12.0-betas更新到不错的新版本1.20.0。例如:我们将google-http- client-1.12.0-beta.jar更新为google-http-client-android-1.20.0.jar。 当我们执行以下代码时: 我们得到这个惊人的错误报告: 有人知道如何解释吗?我们肯定不会! 问题答案: 这仅意味着带有特定参数列