标签:js ioccc javascript
前两天看到这篇文章, 有一种IOCCC的风格. 忍不住就做了下面的分析, 不足之处希望有高人不吝赐教, 先在此谢过.
很可惜, 是自动生成的. 不过还是有很多非常值得学习的地方.
_ = ~[]; // -1;
/* 利用空数组和弱类型语言特性按位取反的来, 忽略类型js中空数组的值是与false和0相等的 */
_ = {
___ : ++_, // 0, 自增一
$$$$ : (![] + "")[_], // "f", false的第一个字符
/* 很有意思的是, 对空数组取反也是false. 因为空数组实际是存在的, 所以存在的值取反为false. 但是存在的对象转换的值与false相同并不能代表这个对象的值是false. js中false和0也是相等的 */
__$ : ++_, // 1, 自增一
$_$_ : (![] + "")[_], // "a", false的第二个字符
_$_ : ++_, // 2, 自增一
$_$$ : ({} + "")[_], // "b", [object Object]的第三个字符
$$_$ : (_[_] + "")[_], // "d", undefined的第三个字符
_$$ : ++_, // 3, 自增一
$$$_ : (!"" + "")[_],// "e", true的第四个字符
$__ : ++_, // 4, 自增一
$_$ : ++_, // 5, 自增一
$$__ : ({} + "")[_], // "c", [object Object]的第六个字符
$$_ : ++_, // 6, 自增一
$$$ : ++_, // 7, 自增一
$___ : ++_, // 8, 自增一
$__$ : ++_ // 9, 自增一
};
_.$_ = (_.$_ = _ + "")[_.$_$] // "c", [object Object]的第六个字符
+ (_._$ = _.$_[_.__$]) // "o", [object Object]的第二个字符
+ (_.$$ = (_.$ + "")[_.__$]) // "n", undefined的第二个字符
+ ((!_) + "")[_._$$] // "s", false的第四个字符
+ (_.__ = _.$_[_.$$_]) // "t", [object Object]的第七个字符
+ (_.$ = (!"" + "")[_.__$]) // "r", true的第二个字符
+ (_._ = (!"" + "")[_._$_]) // "u", true的第三个字符
+ _.$_[_.$_$] // "c", [object Object]的第六个字符
+ _.__ // "t", 上面赋值
+ _._$ // "o", 上面赋值
+ _.$; // "r", 上面赋值
_.$$ = _.$ // "r", 上面赋值
+ (!"" + "")[_._$$] // "e", true的第四个字符
+ _.__ // "t", 上面赋值
+ _._ // "u", 上面赋值
+ _.$ // "r", 上面赋值
+ _.$$; // "n", 上面赋值
_.$ = (_.___)[_.$_][_.$_]; // Function()
/* _.___ 的值是0, _.$_是上面拼的"constructor", 所以就是(0)["constructor"]["constructor"], 0的构造函数式Number(), Number()的构造函数式Function() */
_.$( // Function(
_.$( // Function
_.$$ // return, 上面拼的
+ "\"" // ", 字符串开始
+ _.$$$$ // "f", 上面赋值
+ (![] + "")[_._$_] // "l", false的第三个字符
+ _.$_$_ // "a", 上面赋值
+ "\\" // "\"
+ _.__$ // "1", 上面赋值
+ _.$$_ // "6", 上面赋值
+ _.___ // "0", 上面赋值
/* "\160", 八进制的"p" */
+ "\\" // "\"
+ _.__$ // "1", 上面赋值
+ _.$$_ // "6", 上面赋值
+ _.___ // "0", 上面赋值
/* "\160", 八进制的"p" */
+ "\\" // "\"
+ _.__$ // "1", 上面赋值
+ _.$$$ // "7", 上面赋值
+ _.__$ // "1", 上面赋值
/* "\171", 八进制的"y" */
+ ".\\" // ".\"
+ _.__$ // "1", 上面赋值
+ _.$_$ // "5", 上面赋值
+ _.__$ // "1", 上面赋值
/* "\151", 八进制的"i" */
+ "\\" // "\"
+ _.__$ // "1", 上面赋值
+ _.$_$ // "5", 上面赋值
+ _.$$_ // "6", 上面赋值
/* "\156", 八进制的"n" */
+ "\\" // "\"
+ _.__$ // "1", 上面赋值
+ _.$_$ // "5", 上面赋值
+ _.__$ // "1", 上面赋值
/* "\151", 八进制的"i" */
+ _.__ // "t", 上面赋值
+ "();" // "();", 函数调用结束
+ "\"" // ", 字符串结束
)() // 函数调用结束
/* 构造字符为函数 */
)(); // 函数调用结束代码中巧妙借用true, false, [object Object]和八进制转义产生字符, 并使用constructor将字符转换为可运行的语句.
本来打算分析下生成网站的源码的, 不过最近实在太忙了. 以后有机会吧.
本文出自 “temp” 博客,转载请与作者联系!
标签:js ioccc javascript
原文地址:http://8318007.blog.51cto.com/8308007/1586069