1. 程式人生 > >只用這 6 個字元,就可以寫出任意 JavaScript 程式碼!

只用這 6 個字元,就可以寫出任意 JavaScript 程式碼!

你可能在網上見過有人用 幾個不同的字元寫的各種稀奇古怪的 JavaScript 程式碼,雖然看起來奇怪,但是能正常執行!比如這個:

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

你猜執行結果是什麼?你可以自己去控制檯試一下。

看起來很神奇,但這到底是怎麼回事呢?

事實上,你幾乎可以用下面這 6 個字元寫出任意的 JavaScript 程式:

[]()!+

很多人都知道這個技巧,但是沒有多少開發人員知道它到底是如何工作的。今天,我們就來看看它背後的執行原理。我們的目標是用這幾個字元來寫出字串“self”

。姑且用這個字串向 Self 語言致敬,JavaScript 的靈感來源之一就是它。

基本原理

我們之所以能夠拋開其他字元不用,要歸功於 JavaScript 的型別系統和資料型別轉換機制。

這 6 個字元是這樣各顯神通的:[]可以用來建立陣列,!+可以在陣列上執行一些操作,再用()給這些操作分組。

先看一個簡單的陣列:

[]

陣列前加上!會把它轉成布林值。陣列被認為是真值,因此取非之後變成了false

![] === false

除非轉換為類似型別,否則無法將不同型別的值加在一起。JavaScript 在進行轉換時遵循一個預定義的規則:

在表示式2 + true中,JavaScript 會將true

轉成數字,得到表示式2+1

在表示式2 + "2"中,JavaScript 會將數字轉成字串,得到2 + "2" === "22"

這些轉換規則還不算糟糕,但是對於其他型別,好戲馬上來了。

JavaScript 陣列強制轉換

陣列相加會轉換成字串並連線起來。空陣列轉換為空字串,因此將兩個陣列相加將得到空字串。

[] + [] === "" + "" === ""

陣列跟其他型別值相加時也一樣:

![] + [] === "false" + "" === "false"

驚不驚喜?我們得到了目標字串"self"所包含的幾個字元!

如果我們能產生一些數字,就可以按正確的順序提取所需的字元:

"false"[3] === "s"

(![] + [])[3] === "s"

那麼,如何生成數字呢?

生成數字

前面提到了,可以把陣列轉成布林值。那如果用加號+把它轉成數字會怎樣?

+[] === ???

JavaScript 會嘗試呼叫陣列的valueOf方法,但是發現不存在這個方法,然後就轉而呼叫toString() 方法了。因此上面的程式碼等效於:

+[] === +""

將字串轉換為數字將產生以下結果:

+"42" === 42
+"esg" == NaN
+"" === 0

空字串是一個 false值,跟 null,undefined和數字零類似,因此將其中任何一個轉換為數字都會變成零:

+null === 0
+undefined === 0
+false === 0
+NaN === 0
+"" === 0

因此,將陣列轉換為數字需要先將其轉換為字串,最後轉成 0:

+[] === +"" === 0

第一個數字已經造出來了!我們還需要更多數字,繼續:

!0 === !false
!false === true

!0 === true

0 取否就得到一個為真的布林值。為真的布林值轉成數字,就是1

+true === 1

有了 1,自然就可以得到2,所謂道生一,一生二,二生三,三生萬物……

用上面的轉換大法,可以輕鬆得到我們想要的這些數字:

1 === +true == +(!0) ==== +(!(+[])) === +!+[]

1 === +!+[]
2 === +!+[] +!+[]
3 === +!+[] +!+[] +!+[]
4 === +!+[] +!+[] +!+[] +!+[]

臨門一腳,大功告成

總結下這些規則:

  • 陣列屬於真值,取否就得到 false![] // false
  • 陣列相加時會轉換成字元:[] + [] // ""
  • 空陣列轉成數字得到 0,再去否得到 true,再轉成數字得到1+(!(+[])) === 1

根據這些規則,我們就能得到想要的字串。看下面這個示意圖就很清楚了:

![] + [] === "false"
+!+[] === 1

(![] + [])[3] + (![] + [])[4] + (![] + [])[2] + (![] + [])[0]
^^^^^^^^^^      ^^^^^^^^^^      ^^^^^^^^^^      ^^^^^^^^^^      
  "false"         "false"         "false"         "false"       

^^^^^^^^^^^^^   ^^^^^^^^^^^^^   ^^^^^^^^^^^^^   ^^^^^^^^^^^^^    
      s               e               l               f         

最終的表示式就是這樣:

(![] + [])[+!+[]+!+[]+!+[]] + 
(![] + [])[+!+[]+!+[]+!+[]+!+[]] + 
(![] + [])[+!+[]+!+[]] +
(![] + [])[+[]]

整理下空格和換行,就是一行程式碼:

(![]+[])[+!+[]+!+[]+!+[]]+(![]+[])[+!+[]+!+[]+!+[]+!+[]]+(![]+[])[+!+[]+!+[]]+(![]+[])[+[]]

現在你應該明白了那些神奇 JavaScript 程式碼的原理了吧?發揮你的想象,看還能寫出其他什麼來?比如,2020 年剛到,來個 “Happy New Year”?

Anyway,Happy New Year!

更多前端技術乾貨盡在微信公眾號:1024譯站

相關推薦

只用 6 字元可以任意 JavaScript 程式碼

你可能在網上見過有人用 幾個不同的字元寫的各種稀奇古怪的 JavaScript 程式碼,雖然看起來奇怪,但是能正常執行!比如這個: (!(~+[])+{})[--[~+""][+[]]*[~+[]] + ~~!+[]]+({}+[])[[~!+[]]*~+[]] 你猜執行結果是什麼?你可以

Python工作好找嗎? 你必須要懂6祕訣工作沒問題

隨著人工智慧時代的到來,Python的需求也變的越來越大了。從目前各大IT招聘網上顯示招聘需求是非常大,而且薪資基本都在10k起,高的可達40-50k 一、那找Python工作一般需要什麼要求呢?1、熟悉python編碼規範,良好的程式設計習慣;2、熟悉python基本資料型別的操作;3、熟悉python各

讀懂關鍵詞明白迅雷鏈為什麼受開發者歡迎

作為一條底層主鏈,迅雷鏈的快速崛起簡直不可思議。一方面,主鏈是整個行業最為擁擠的賽道,調查資料顯示,目前區塊鏈有5000個公鏈,比國內有註冊的區塊鏈開發工程師人數還要多幾倍。同時,主鏈面臨的競爭也很激烈,國內有的是起步早、團隊大的主鏈專案,其中很有幾個在世界範圍都比較知名的專案,遑論還有自帶大神光環

Python工作好找嗎?你必須要懂6祕訣工作沒問題

隨著人工智慧時代的到來,Python的需求也變的越來越大了。從目前各大IT招聘網上顯示招聘需求是非常大,而且薪資基本都在10k起,高的可達40-50k 一、那找Python工作一般需要什麼要求呢? 1、熟悉python編碼規範,良好的程式設計習慣; 2、熟悉p

自媒體人不知怎麼剪輯視訊6神器助你秒變視訊達人

隨著短視訊風口的興起,視訊剪輯已然成為自媒體人不可或缺的技能之一。如何更快更好地製作出精美的視訊,無疑成為自媒體人極其關注的重點。作為經常剪輯旅遊風光的知享君,今天分享這6個視訊剪輯神器,助你秒變視訊達人。 快剪輯 作為360出品的產品,快剪輯憑藉其簡易上手的優勢迅速搶佔視訊剪輯領域市

面試官問6問題你要警惕

  “先做個自我介紹吧”、“談談你的優缺點”、“你打算怎麼開展工作”、“你的興趣愛好是什麼”……這些問題在不少求職者看來都很傻很天真,難道我回答了面試官就真信了?      根據前程無憂論壇(bbs.51job.com)近期就“最讓人反感的面試題”為主題進行的調查結

沒解決3問題別再扯系統高可用了

  作者:王曄倞 連結:https://dbaplus.cn/news-141-2712-1.html 上個月,我

職場必備學會4技巧便可輕松操作Excel

aec 今天 分享 輕松 log 組合鍵 shift ctrl nag 在職場中,使用Excel表格的場合實在是太多了。今天小編就和大家分享一下Excel中最實用的的4個技巧,讓你在使用Excel表格時省時省力! 快速輸入特定編號 選中單元格,按"Ctrl+1&q

HashMap 和 Hashtable 的 6 區別最後一個沒幾個人知道

HashMap 和 Hashtable 是 Java 開發程式設計師必須要掌握的,也是在各種 Java 面試場合中必須會問到的。 但你對這兩者的區別瞭解有多少呢? 現在,棧長我給大家總結一下,或許有你不明朗的地方,在棧長的指點下都會撥開迷霧見晴天。 1、執行緒安全 Hashtable 是執行緒安全的,Hash

軟體測試猿把握7階段成為“隱形富裕人口”實現致富夢

前段時間有個叫“隱形貧困人口”的詞特別火,指的就是那些看上去生活特別滋潤,實際上卻很貧困的人。 而與之相反的就是“隱形富裕人口”了。那麼哪種行業或者職業屬於此類呢?收入水平高於市場上大部分職業,卻並不愛炫富的軟體測試員無疑是“隱形富裕人口”的典型代表。 但與此同時,也有很

用1、2、2、3、4、5數字打印所有不同的排列

轉換成整型值,用累加的方法遍歷從最小到最大的所有數值,輸出包含指定字元及其指定個數的數字。 由於要遍歷更多的數字,所以耗時較大。 public class Main { public static int count = 0; priva

在你放棄以前問問自己6問題

告訴 需要 我們 選擇 真心 問題 如果 zhang 試用   放棄永遠比堅持還要容易,放棄只要一天,堅持卻可能要數年之久;放棄很容易,堅持很困難,這也是為什麽能夠成功的人永遠是少數的那些人。  在你放棄以前,試著跟自己的內心對話,找出對自己最好的一個決定。  在你放棄

回答了問題可以打造最佳App首頁

如果把手機APP比作人的話,首頁就是臉面了。首頁是一款產品的大門,好的開頭就是成功的一半。 調查表示,26%的手機APP的平均使用次數只有一次。對首次使用產品的用戶而言,首頁的好壞關乎到用戶對該產品的第一印象,無法在首頁取悅挑剔的用戶的眼睛,提供好的用戶體驗,基本就宣告了產品的失敗。因此,想

用好6新功能讓你的項目設計事半功倍

本文由Mockplus提供素材。 Mockplus3.2新功能發布有段時間了,新功能具體能給我們的設計帶來什麽呢?且聽我一一道來: 格子 格子功能,可以快速制作重復的布局,提高設計效率。 步驟: 一

如果你是第一次創業一定要避免犯6致命錯誤

開會 ron 最終 筆記 深入 創業公司 什麽是 src 即使 打造一家成功的創業公司太不容易。很多創業者都是在經歷了幾次失敗的創業之後才最終打造了一家實現規模化發展的盈利公司。之所以會這樣,部分原因是因為初次創業者經常會犯一些嚴重危害公司發展的重大錯誤。 有數據統計,超

java中輸入三字元按各字元的ASCII碼從小到大的順序輸出字元

import java.util.Scanner; public class Main {     public static void main(String[] args) {         Scanne

Android9.0來了6重大更新你得知道

原標題:Android9.0來了,這6個重大更新你得知道 三月份是手機密集釋出的日子,從MWC之後, 三月份是手機密集釋出的日子,從MWC之後,國內外不少廠商都推出了自家的新品。如果說去年的浪潮是全面屏設計的話,今年的趨勢恐怕就是劉海屏了。不管喜不喜歡,我們都要承認劉海屏是提高屏佔比

提高面試效率6面試小技巧了解一下

雖說面試是個雙向選擇的過程,但前提是你能拿到offer才有選擇去與不去的機會。沒有拿到offer說不去的就是耍流氓。 其實,根據招聘網上的職位需求和薪資待遇,同一家公司的所遇到的面試者都呈現正態分佈的趨勢,絕大多數的面試者水平都差不多,那麼你應該如何在面試中突出自己? 這是一個關鍵!

分享程式設計師喜歡逛的網站不知道的話OUT了

如果對程式設計感興趣的話,可以通過哪些網站來學習程式設計知識呢?今天就來介紹程式設計師喜歡逛的幾個牛掰的網站,瞭解這些程式設計師每天休閒時間都在看什麼! 1.部落格園 部落格園是一個面向開發者的知識分享社群,可以那麼幫助開發者通過網際網路來分享知識,可以幫助程式設計師通過程式碼來改變

紅樓夢裡的首詩只有二十盡了曹雪芹一生血淚

今天我來解讀紅樓夢第一回裡被傳播最廣的一首詩,這是一首五絕,前後只有二十個字,卻寫出了曹雪芹一生的悲辛和血淚。 原詩如下: 滿紙荒唐言, 一把辛酸淚。 都雲作者痴, 誰解其中味? 單從字面意思來看,這首詩很好理解,大致是說:我這本書寫的不容易,雖然看上去有很多