zoukankan      html  css  js  c++  java
  • 一行能装逼的JavaScript代码的延伸

    前段就是坑,入坑水真深。 先看看一个黑科技, 纳尼,这是什么东西。

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

    贴入浏览器执行一看,你个XX,你给老子等着。。。。。。。
    然并卵。
    作为一般的青年就此笑过, 可是我不是一般的青年,我是二到无穷的青年。你给老子讲清楚你这sb怎么出来的.

    一行能装逼的JavaScript代码讲得灰常清晰和明白,但是个人觉得还可以补充和扩展,于是就有了这篇文章。

    解析出这个SB还是先懂几个东西:

    1. 运算符的优先级
      一行能装逼的JavaScript代码里面有解释,
      这段装逼代码里面用的只有 ! () ~ + [] -- *
      优先级别 [] () -- ~ ! * +
    2. JS类型转换
      一行能装逼的JavaScript代码里面有解释
      减号-,乘号*,肯定是进行数学运算,所以操作数需转化为number类型
      加号+,可能是字符串拼接,也可能是数学运算,所以可能会转化为number或string
      一元运算,如+[],只有一个操作数的,转化为number类型
      关于转换顺序
      尝试使用ToPrimitive,转换为原始类型,
      转换成功,返回值。
      否则调用valueOf,如果返回是原始类型,返回
      否则调用toString(),如果返回原型类型,返回
      否则,抛出异常
    3. 一些特殊情况的加法
    [] + [] // ''
    [] + {} // '[object Object]'
    {} + [] // 0
    ({} + []) // '[object Object]'
    {} + {} // NaN
    ({} + {}) // '[object Object][object Object]'
    

    {} + []中的第一个{}会被识别为代码块,被忽略掉,
    +[]转换过程
    [] 不是原始类型,调用valueOf
    [].valueOf() 返回的依旧不是原始类型
    [].toString() 返回"",
    +""结果为0
    ({}+[])这里面 {} + [] 是作为表达式执行的,
    {}最终转换为 "[object object]"
    []最终转换为 ""
    相加为 "[object object]"

    好,准备好这些只是之后,我们就可以来解读装逼,为了方便解读,
    我写出每一步的解读, 来,一起装逼,一起飞。

    const results = [
        '(!(~+[])+{})[--[~+""][+[]]*[~+[]] + ~~!+[]]+({}+[])[[~!+[]]*~+[]]', 
        // +[] ==> 0
        '(!(~0)+{})[--[~+""][+[]]*[~+[]] + ~~!+[]]+({}+[])[[~!+[]]*~+[]]',
        // ~0 ==> -1  取反减1
        '(!(-1)+{})[--[~+""][+[]]*[~+[]] + ~~!+[]]+({}+[])[[~!+[]]*~+[]]',
        // !(-1) ==> false 
        '(false+{})[--[~+""][+[]]*[~+[]] + ~~!+[]]+({}+[])[[~!+[]]*~+[]]',
        // false+{} ==> "false[object object]"
        '"false[object object]"[--[~+""][+[]]*[~+[]] + ~~!+[]]+({}+[])[[~!+[]]*~+[]]',
        // +"" ==> 0
        '"false[object object]"[--[~0][+[]]*[~+[]] + ~~!+[]]+({}+[])[[~!+[]]*~+[]]',
        // ~0 ==> -1
        '"false[object object]"[--[-1][+[]]*[~+[]] + ~~!+[]]+({}+[])[[~!+[]]*~+[]]',
        // +[] ==> 0
        '"false[object object]"[--[-1][0]*[~+[]] + ~~!+[]]+({}+[])[[~!+[]]*~+[]]',
        // +[] ==> 0
        '"false[object object]"[--[-1][0]*[~0] + ~~!+[]]+({}+[])[[~!+[]]*~+[]]',
        // ~0 ==> -1
        '"false[object object]"[--[-1][0]*[-1] + ~~!+[]]+({}+[])[[~!+[]]*~+[]]',
        // --[-1][0] ==> -2
        '"false[object object]"[-2*[-1] + ~~!+[]]+({}+[])[[~!+[]]*~+[]]',
        // [-1] ==> "-1"
        '"false[object object]"[-2*"-1" + ~~!+[]]+({}+[])[[~!+[]]*~+[]]',
        // "-1" ==> 1
        '"false[object object]"[-2*-1 + ~~!+[]]+({}+[])[[~!+[]]*~+[]]',
        // -2*-1 ==> 2
        '"false[object object]"[2 + ~~!+[]]+({}+[])[[~!+[]]*~+[]]',
        // +[] ==> 0
        '"false[object object]"[2 + ~~!0]+({}+[])[[~!+[]]*~+[]]',
        // !0 ==> true
        '"false[object object]"[2 + ~~true]+({}+[])[[~!+[]]*~+[]]',
        // ~true ==> -2
        '"false[object object]"[2 + ~-2]+({}+[])[[~!+[]]*~+[]]',
        // ~-2 ==> 2
        '"false[object object]"[2 + 1]+({}+[])[[~!+[]]*~+[]]',
        // 2+1 ==> 3
        '"false[object object]"[3]+({}+[])[[~!+[]]*~+[]]',
        // "false[object object]"[3] ==> s
        '"s"+({}+[])[[~!+[]]*~+[]]',
        // {} ==> "[object object]"
        '"s"+("[object object]"+[])[[~!+[]]*~+[]]',
        // [] ==> ""  [].toString() 
        '"s"+("[object object]"+"")[[~!+[]]*~+[]]',
        // "[object object]"+""  ==> "[object object]"
        '"s"+"[object object]"[[~!+[]]*~+[]]',
        // +[] ==> 0
        '"s"+"[object object]"[[~!0]*~+[]]',
        // !0 => true
        '"s"+"[object object]"[[~true]*~+[]]',
        // ~true ==> -2
        '"s"+"[object object]"[[-2]*~+[]]',
        // +[] ==> 0
        '"s"+"[object object]"[[-2]*~0]',
        // ~0 ==> -1
        '"s"+"[object object]"[[-2]*-1]',
        // [-2] ==> "-2"
        '"s"+"[object object]"["-2"*-1]',
        // "-2" ==> 2
        '"s"+"[object object]"[-2*-1]',
        // -2*-1 ==> 2
        '"s"+"[object object]"[2]',
        // "[object object]"[2] ==> b
        '"s"+"b"',
        // "s" + "b" ==> "sb"
        '"sb"',
    ];
    
    results.forEach( (v,i)=>{
        (function(delay){
            setTimeout(function(){
                console.log(Date.now(), eval(v))
            },delay*5)
        })(i)    
    })
    
    

    你会发现好多sb,哟, 你还真看到这里啊,说的就是你哦。 哈哈。

    这些JavaScript编程黑科技,装逼指南,高逼格代码,让你惊叹不已
    一行能装逼的JavaScript代码
    JS中{}+[]和[]+{}的返回值情况是怎样的
    What is {} + {} in JavaScript?
    JavaScript中圆括号() 和 方括号[] 的特殊用法疑问?
    javascript运算符——条件、逗号、赋值、()和void运算符
    JavaScript values: not everything is an object

  • 相关阅读:
    Python 模块 itertools
    Python 字符串的encode与decode
    python 模块 hashlib(提供多个不同的加密算法)
    暴力尝试安卓gesture.key
    hdu 1300 Pearls(DP)
    hdu 1232 畅通工程(并查集)
    hdu 1856 More is better(并查集)
    hdu 1198 Farm Irrigation(并查集)
    hdu 3635 Dragon Balls(并查集)
    hdu 3038 How Many Answers Are Wrong(并查集)
  • 原文地址:https://www.cnblogs.com/cloud-/p/9110309.html
Copyright © 2011-2022 走看看