zoukankan      html  css  js  c++  java
  • sb 讲解 (!(~+[])+{})[--[~+""][+[]]*[~+[]] + ~~!+[]]+({}+[])[[~!+[]]*~+[]]

    代码:(!(~+[])+{})[--[~+""][+[]]*[~+[]] + ~~!+[]]+({}+[])[[~!+[]]*~+[]]

    输出sb。

    分段解析:

       首先解析s:

        (!(~+[])+{})  --> 输出 "false[object Object]" 

        由于 ! 优先级 高于 +, 所有先算 !(~+[]), 而 ~+[] ,根据标准。。解释器会把 [] 转成 0;从而得到 ~0. =-1,所以 (~+[])=-1,而 !(-1) =false;

        从而得到 (false+{}). 标准规定默认相加会调用toString 操作。相当于 "false"+"[object Object]"; 

        下面解析 索引位置:[--[~+""][+[]]*[~+[]] + ~~!+[]]

        首先确定运算顺序: 由于[]高于 --,-- 优先级高于 *和+。 顺序如下

           1.  [~+""] =r1 = ~(+"")   而 +"" =0; 所以 ~+"" ==>~0=-1;故为 [-1]

           2.  [ +[] ]= r2 = [0]   

           3.  [~+[]]=r3 = [~0] = [-1]

           4.  [(--r1r2)*r2+~~!+[]] =  [--[-1][0]*[-1]+1] = [--(-1)*[-1]+1] = [-2*[-1]+1]=[3]

           返回结果 [3]; 备注 : ~~!+[]  = 1

        所以(!(~+[])+{})[--[~+""][+[]]*[~+[]] + ~~!+[]]='s';

      下面看b:({}+[])[[~!+[]]*~+[]]

        首先看:({}+[]) 结果为 "[object Object]". 按标准会把两边操作数toString 操作。结果 "[object Object]"+""="[object Object]"

        然后 [[~!+[]]*~+[]]:

        1. [~!+[]]

          1.1 +[]=r1=0

          1.2  !r1=r2=!0=true   (-)一元操作符说明:

          1.3  ~r2=~true=-2

        所以 [~!+[]]=[-2]

        2.~+[]

          2.1 +[]=r1=0     (+): 一元操作符说明:http://es5.github.io/index.html#x11.4.6

          2.2 ~r1=~0=-1   ( ~ )一元操作符说明:http://es5.github.io/index.html#x11.4.8

          所以 ~+[]=-1    

        所以 [[~!+[]]*~+[]]=[-2]*[-1]=2      (*) 二元操作符说明:http://es5.github.io/index.html#x11.5.1

        所以 ({}+[])[[~!+[]]*~+[]]= "[object Object][2]"=b;

        

       

            

        

        

  • 相关阅读:
    ajax异步服务器获取时间
    JavaScript基本知识
    JavaScript使用button提交表单
    spring与hibernate整合
    Spring的事务属性
    注解方式实现Spring声明式事务管理
    svn的安装使用
    sbn
    恢复oracle中误删除drop掉的表
    ORA-20000: ORU-10027: buffer overflow, limit of 2000 bytes的解决办法
  • 原文地址:https://www.cnblogs.com/Mr-Joe/p/4239460.html
Copyright © 2011-2022 走看看