一行能裝逼的JavaScript程式碼的延伸
前段就是坑,入坑水真深。 先看看一個黑科技, 納尼,這是什麼東西。
(!(~+[])+{})[--[~+""][+[]]*[~+[]] + ~~!+[]]+({}+[])[[~!+[]]*~+[]]
貼入瀏覽器執行一看,你個XX,你給老子等著。。。。。。。
然並卵。
作為一般的青年就此笑過, 可是我不是一般的青年,我是二到無窮的青年。你給老子講清楚你這sb怎麼出來的.
在一行能裝逼的JavaScript程式碼講得灰常清晰和明白,但是個人覺得還可以補充和擴充套件,於是就有了這篇文章。
解析出這個SB還是先懂幾個東西:
- 運算子的優先順序
一行能裝逼的JavaScript程式碼裡面有解釋,
這段裝逼程式碼裡面用的只有 ! () ~ + [] — *
優先順序別 [] () — ~ ! * + - JS型別轉換
一行能裝逼的JavaScript程式碼裡面有解釋
減號-,乘號*,肯定是進行數學運算,所以運算元需轉化為number型別
加號+,可能是字串拼接,也可能是數學運算,所以可能會轉化為number或string
一元運算,如+[],只有一個運算元的,轉化為number型別
關於轉換順序
嘗試使用ToPrimitive,轉換為原始型別,
轉換成功,返回值。
否則呼叫valueOf,如果返回是原始型別,返回
否則呼叫toString(),如果返回原型型別,返回
否則,丟擲異常 - 一些特殊情況的加法
[] + [] // ``
[] + {} // `[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
相關文章
- 一行神奇的javascript程式碼JavaScript
- 裝逼的最高境界---一行js程式碼完成一個簡易版的貪吃蛇遊戲JS遊戲
- JavaScript 裝逼指南JavaScript
- 翻譯 | 一行 JavaScript 程式碼的逆向工程JavaScript
- 這些JavaScript程式設計黑科技,裝逼指南,高逼格程式碼,讓你驚歎不已JavaScript程式設計
- 如何讀懂並寫出裝逼的函式式程式碼函式
- 通過一行程式碼學習javascript行程JavaScript
- 一行Python程式碼能實現什麼喪心病狂的功能?Python
- 一行 CSS 程式碼的魅力CSS
- javascript能夠回溯的打字機效果程式碼例項JavaScript
- javascript應用cookie的封裝程式碼JavaScriptCookie封裝
- 一行程式碼完成 JAVA 的 EXCEL 讀寫——EasyExcel 的方法封裝行程JavaExcel封裝
- 裝逼技巧:程式設計師如何用程式碼罵別人sb,以及證明自己牛逼!程式設計師
- 裝逼的寫法 jsJS
- 推薦22個實用的一行Javascript程式碼Date大全,建議收藏JavaScript
- 第一行程式碼——書的理解行程
- 被程式碼逼瘋過兩次的程式設計師程式設計師
- 原生javascript對ajax的封裝程式碼例項JavaScript封裝
- Spring的資料庫程式設計淺入淺出——不吹牛逼不裝逼Spring資料庫程式設計
- Linux中文延伸安裝套件的概述(轉)Linux套件
- 苦逼的Coffee程式猿
- 常用的JavaScript程式碼JavaScript
- 一行程式碼引發的恐懼行程
- 讓 Chrome 崩潰的一行 CSS 程式碼ChromeCSS
- javascript操作cookie程式碼封裝JavaScriptCookie封裝
- 致那些自嘲碼農的苦逼程式設計師程式設計師
- javascript字串操作程式碼封裝程式碼例項JavaScript字串封裝
- JavaScript封裝的id選擇器程式碼例項JavaScript封裝
- 判斷手機是否安裝app的javascript程式碼APPJavaScript
- Python安裝與第一行程式碼和儲存程式Python行程
- 一行 Python 程式碼Python
- React loves you —“洞悉Redux裝的逼”ReactRedux
- [WCF]缺少一行程式碼引發的血案行程
- 分享一段牛逼程式碼
- 苦逼的程式設計師程式設計師
- 一行程式碼賣出570美元, 天價程式碼的內幕行程
- javascript的for in例項程式碼JavaScript
- 去除 JavaScript 程式碼的怪味JavaScript