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

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(标准模式)下)。

以上是 (![] + [])[+ []]…解释为何有效 的全部内容, 来源链接: utcz.com/qa/401248.html

回到顶部