一行能裝逼的JavaScript程式碼的延伸

淡色的雲發表於2018-05-30

前段就是坑,入坑水真深。 先看看一個黑科技, 納尼,這是什麼東西。

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

貼入瀏覽器執行一看,你個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


相關文章