cdx*_*dxf 103 javascript
alert((![]+[])[+[]]+(![]+[])[+!+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]);
Run Code Online (Sandbox Code Playgroud)
此代码的输出是:fail
.为什么?
顺便说一句(![]+[])[+!+[]] == 'false'[1]
,对吗?但为什么![]+[] == "false"
和为什么+!+[] == 1
?
CMS*_*CMS 124
正如@Mauricio评论的那样(![]+[])[+[]]
是"f"("假"的第一个字母),(![]+[])[+!+[]])
是"a"等等......
它是如何工作的?
我们来看看第一个字符'f':
(![]+[])[+[]]; // 'f'
Run Code Online (Sandbox Code Playgroud)
表达式的第一部分 - 在括号之间 - 由![]+[]
Addition运算符的第一个操作数组成,![]
它将生成false
,因为数组对象 - 与任何其他Object实例一样 - 是真实的,并应用逻辑(!)NOT一元false
例如,运算符,它产生值.
![]; // false, it was truthy
!{}; // false, it was truthy
!0; // true, it was falsey
!NaN; // true, it was falsey
Run Code Online (Sandbox Code Playgroud)
在它之后,我们有第二个操作数,一个空数组,[]
这只是为了将false
值转换为String,因为空数组的字符串表示只是一个空字符串,相当于:
false+[]; // "false"
false+''; // "false"
Run Code Online (Sandbox Code Playgroud)
最后一部分,括号后面的方括号,它们是属性访问器,它们接收一个表达式,由一元空间运算符再次应用于空数组.
Unary Plus操作员所做的是类型转换,Number
例如:
typeof +"20"; // "number"
Run Code Online (Sandbox Code Playgroud)
再一次,这应用于一个空数组,正如我之前所说,数组的字符串表示形式是一个空字符串,当您将空字符串转换为数字时,它将转换为零:
+[]; // 0, because
+[].toString(); // 0, because
+""; // 0
Run Code Online (Sandbox Code Playgroud)
因此,我们可以在某些步骤中"解码"表达式:
(![]+[])[+[]];
(false+[])[+[]];
(false+'')[+[]];
(false+'')[0];
('false')[0]; // "f"
Run Code Online (Sandbox Code Playgroud)
请注意,在String值上使用括号表示法访问字符不是ECMAScript 3rd的一部分.版本规范,(这就是该charAt
方法存在的原因).
然而,这种表示字符串字符的"索引属性"在ECMAScript 5上标准化,甚至在标准化之前,该功能在很多浏览器中都可用(即使在IE8(标准模式)中).
归档时间: |
|
查看次数: |
13176 次 |
最近记录: |