送給產品經理的一段代碼 (!(~+[]) + {})[--[~+""][+[]] * [~+[]] + ~~!+[]] + ({} + [])[[~!+[]]

送給產品經理一段代碼 讓他放到 console 去javascript

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

其實這段代碼是個人同事發給個人, 我定睛一看必定有坑, 因而準備破解一番前端

其實這裏面涉及到的知識點無非三個java

  • 數據類型的轉換
  • 位運算(按位非)
  • 運算符的優先級

分析以前我推薦你們看幾篇文章git

首先咱們把代碼進行拆分github

(!(~+[]) + {})[--[~+""][+[]] * [~+[]] + ~~!+[]]
+
({} + [])[[~!+[]] * ~+[]]
複製代碼

簡單來看就是 (A)[B] + (C)[D]chrome

首先來看 A !(~+[]) + {}windows

+[] -(數據類型轉換)-> 0
~+[] --> ~0 -(位運算)-> -1
!(~+[]) --> !(-1) -(類型轉換)-> false
(!(~+[]) + {}) --> false + {} -(類型轉換)-> 'false[object Object]'
複製代碼

再來看 B --[~+""][+[]]*[~+[]] + ~~!+[]bash

[~+""] --> [~0] --> [-1]
+[] --> 0
--[~+""][+[]] --> --[-1][0] --> --(-1) --> -2

[~+[]] --> [~0] --> [-1]

~~!+[] --> ~~!0 --> ~~true --> ~-2 -> 1

B --> -2 * [-1] + 1 --> 2 + 1 --> 3

複製代碼

那麼 (A)[B] --> 'false[object Object]'[3] --> 's'spa

再來看 C ({} + [])

這裏的 {} 實際上是個代碼塊

因此等價於 +[][object Object]

再來看 D [~!+[]] * ~+[]

[~!+[]] --> [~!0] --> [!1] --> -2
~+[] --> ~0 --> -1
D -> -2 * -1 --> 2
複製代碼

因此 (C)[D] --> '[object Object]'[2] --> 'b'

那麼

(!(~+[]) + {})[--[~+""][+[]] * [~+[]] + ~~!+[]] + ({} + [])[[~!+[]] * ~+[]]
--> (A)[B] + (C)[D) 
--> 's' + 'b' 
--> 'sb'
複製代碼

謝謝觀看 😄

如今能夠發給產品經理了

讓他打開 chrome, (windows: F12, mac: command+option+(j or i))

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

這就是咱們前端一直想對你說的話

參考文章

文中對產品經理的冒犯僅爲了行文效果 😅 前端和產品是相親相愛的一家人 😆

github 原文地址

相關文章
相關標籤/搜索