• 首页
  • 技术
  • 旅行
  • 车模
  • 关于

JZ's Blog

{技术, 绘画, 旅行, 摄影, 多肉}
  • 首页
  • 技术
  • 旅行
  • 车模
  • 关于
首页  /  技术  /  再来看那句让人抓狂的代码
31 一月 2011

再来看那句让人抓狂的代码

作者:jz1108
技术 写评论

现在就来仔细说说那段代码的含义(原文在此),首先给出完整代码:

(_=[_=[]][(_+!![])[$=(!!_/!!_)]+(!!$+_)[-~-~$]+'v'+(!(_/_)+[])[-~-~$]+(!([]/($))+[])[$]+([]+!_)[-~-~$]+(!!{}+[])[-~-~$]])()[(!({}+_)+_)[$]+(!({}+[])+[])[-~$]+((''+!![]+''))[-~-~$]+(!![]+'')[$]+((!!_+[]))[$-$]]($/$);

这段代码可划分为两部分:

(_=[_=[]][(_+!![])[$=(!!_/!!_)]+(!!$+_)[-~-~$]+'v'+(!(_/_)+[])[-~-~$]+(!([]/($))+[])[$]+([]+!_)[-~-~$]+(!!{}+[])[-~-~$]])()
[(!({}+_)+_)[$]+(!({}+[])+[])[-~$]+((''+!![]+''))[-~-~$]+(!![]+'')[$]+((!!_+[]))[$-$]]($/$)

基本结构是:()()[]()。第一个括号中有一个函数,接下来的括号要执行它,执行后返回一个对象,再调用对象的某个方法,这个方法是通过后面的中括号定义的,最后的括号就是执行这个方法。

先来看第一部分,把第一个括号中的内容提取出来:

_=[_=[]][(_+!![])[$=(!!_/!!_)]+(!!$+_)[-~-~$]+'v'+(!(_/_)+[])[-~-~$]+(!([]/($))+[])[$]+([]+!_)[-~-~$]+(!!{}+[])[-~-~$]]

这里,我们先定义变量 _ 为一个空数组 [],因此上面代码等价于:

_=[_=[]][([]+!![])[$=(!![]/!![])]+(!!$+[])[-~-~$]+'v'+(!([]/[])+[])[-~-~$]+(!([]/($))+[])[$]+([]+![])[-~-~$]+(!!{}+[])[-~-~$]]

其中 !![]/!![] 的结果是1,那么变量 $ 也就是 1。~$ 等于 -2,-~$ 就是 2,同理 -~-~$ 就是 3,上面代码等价于:

_=[_=[]][([]+!![])[1]+(!!1+[])[3]+'v'+(!([]/[])+[])[3]+(!([]/1)+[])[1]+([]+![])[2]+(!!{}+[])[2]]

[] + !![] 返回字符串 'true',!!1 + []返回字符串 'true',按照类似方式上面代码推出:

_=[_=[]][('true')[1]+('true')[3]+'v'+('true')[3]+('true')[1]+('false')[3]+('true')[3]]

也就是:

_=[[]]['r' + 'e' + 'v' + 'e' + 'r' + 's' + 'e']

,即:

_ = [[]].reverse

,即定义变量 _ 为一个数组的reverse方法。

接下来,我们执行了方法 _,它返回了window对象,因此整个代码就是:

window[(!({}+_)+_)[$]+(!({}+[])+[])[-~$]+((''+!![]+''))[-~-~$]+(!![]+'')[$]+((!!_+[]))[$-$]]($/$);

等价于:

window[('false')[1]+('false')[2]+('true')[3]+('true')[1]+('true')[0]](1);

等价于:

window['a' + 'l' + 'e' + 'r' + 't'](1)

,即:

window.alert(1)

,亦即:

alert(1)

。

 Previous Article 我来写一段让人抓狂的代码
Next Article   小心转义符号 —— JS字符串字面量与字符串的值

相关文章

  • iOS 13 Safari 的一些变化

    2019年11月13日
  • WebGL 文章汇总

    2019年9月12日
  • 高性能 WebGL —— 使用 ImageBitmap 提升纹理性能

    2019年3月24日

留言

取消回复

近期文章

  • 记录一次解决 no buffer is bound to enabled attribute 报错的过程
  • TypeScript 中的装饰器
  • iOS 13 Safari 的一些变化
  • WebGL 文章汇总
  • 高性能 WebGL —— 使用 ImageBitmap 提升纹理性能

近期评论

  • lew发表在《WebGL绘制详解之五:Stencil Buffer》
  • jz1108发表在《WebGL基础绘制之一:绘制一个点》
  • jz1108发表在《WebGL 文章汇总》
  • xtx发表在《WebGL 文章汇总》
  • thy发表在《WebGL基础绘制之一:绘制一个点》

文章归档

  • 2021年三月
  • 2019年十一月
  • 2019年九月
  • 2019年三月
  • 2018年十二月
  • 2018年十一月
  • 2018年十月
  • 2017年十一月
  • 2017年十月
  • 2017年九月
  • 2017年五月
  • 2017年四月
  • 2017年三月
  • 2017年二月
  • 2017年一月
  • 2016年十一月
  • 2016年十月
  • 2016年四月
  • 2016年三月
  • 2016年二月
  • 2016年一月
  • 2015年十二月
  • 2015年十一月
  • 2015年十月
  • 2015年九月
  • 2015年八月
  • 2015年七月
  • 2015年六月
  • 2015年三月
  • 2014年十二月
  • 2014年十一月
  • 2014年十月
  • 2014年八月
  • 2014年七月
  • 2014年六月
  • 2014年五月
  • 2014年四月
  • 2014年三月
  • 2014年二月
  • 2014年一月
  • 2013年十二月
  • 2013年十一月
  • 2013年十月
  • 2013年九月
  • 2013年八月
  • 2013年七月
  • 2013年六月
  • 2013年五月
  • 2013年四月
  • 2013年三月
  • 2013年二月
  • 2013年一月
  • 2012年十二月
  • 2012年十月
  • 2012年九月
  • 2012年七月
  • 2012年六月
  • 2012年五月
  • 2012年一月
  • 2011年十一月
  • 2011年十月
  • 2011年九月
  • 2011年八月
  • 2011年七月
  • 2011年六月
  • 2011年五月
  • 2011年四月
  • 2011年二月
  • 2011年一月
  • 2010年十二月
  • 2010年十月
  • 2010年九月
  • 2010年六月
  • 2010年五月
  • 2010年四月
  • 2010年三月
  • 2010年二月
  • 2010年一月
  • 2009年十二月
  • 2009年十一月
  • 2009年九月
  • 2009年八月
  • 2009年六月
  • 2009年三月
  • 2009年二月
  • 2009年一月

分类目录

  • 地图API
  • 多肉
  • 开发
  • 技术
  • 摄影
  • 旅行
  • 未分类
  • 汽车
  • 绘画
  • 美食
  • 车模
  • 随笔

功能

  • 登录
  • 文章RSS
  • 评论RSS
  • WordPress.org
© Copyright 2015. Theme by BloomPixel.