七個讓 JavaScript 源碼顯示為聰明(或令人厭惡)的方法

1. 使用反向邏輯

這邊我們先從比較簡單的『最佳化』開始著手。這個技巧的目的是盡可能的把簡單的邏輯變得看起來很複雜的樣子。

2. 使用控制字元作為變成名稱

編譯式的軟體產品基本上對大多數人而言就是一個黑盒,但這點在 JavaScript 上就不同了,任何人只要打開瀏覽器開發工具,就可以輕易看到源碼,甚至加幾個中斷點就可以看到物件狀態。(即使 Uglify 之後也沒用,瀏覽器開發工具也具備了 beautify 功能:) ) 為了阻礙有心人士來檢視執行期的物件狀態,使用控制字元來當變數名稱是個簡單的方法:

這樣做之後在開發工具中的檢視器看到的會是這樣:(註:原作者說會看不到任何內容,顯然在新版 Chrome 的開發工具中修復了這個 “issue”)

在 console 中想要 dump 的話結果會是這樣:

甚至也可以放一點 Zalgo Text 當作變數名稱來惡搞: (註:譯者極討厭 Zalgo Text,尤其在 Social Network 中使用真的令人惱怒,拜託不要!)

3. 複習一下三角函數

在我輟學之前,我的老師總是說數學與程式設計是高度相關。在我的經驗中我覺得並非如此 (註:譯者認為的確大部分高度相關,要視你做的領域來決定比例。如果是做 driver porting 大概是真的比較無關,但與 UI / Web / Codec 等等,甚至是近期顯學 machine learning 都顯示出數學應該是一個程式師重要的知識根基),實際上,我甚至覺得這只是想要誘拐學生註冊更多課程的方法(註:此想法不可取啊)。好吧,是該時間來讓那可怕的學貸有點作用了。
不要寫成這樣:
應該將其寫成:
上式唯一會被解讀為 true 只在 val 剛好是 2*Math.PI 的倍數的時候(註:這顯然是錯的,後面解釋),你甚至根本不需要管 val 是不是數字,這真的不重要,實際上這已經一點都不重要了。(註:這段話顯然是在暗示這段根本就是亂來)

譯註:首先 val 若是空字串 “” 或是 null 都會使得該式為 true。並且當 val 真的是 2*Math.PI 的倍數時 (!val) 並不等值於 (Math.floor(.5 + ((Math.cos(val)*.5))))。似乎原作者想要顯示出他的數學真的不好?說真的,JavaScript 中是有一個 double negative 的 trick 來把類 false 的值(如 null, undefined, NaN …) 轉為 boolean 的方法,只要寫成 !!val 就好了。不過這跟三角函數無關啊,哈哈。

4. 利用 JavaScript 寬容的特性

你有過幾次不小心把 if 的 condition check 寫成 assign 的經驗吧?這種錯誤令人困擾,因其不會有 error 而源碼乍看之下也無錯,但是基本上就是個低級錯誤。
當有人看到你這段 code 的時候一定會認為這是個錯誤而且想要嘗試去修復它,結果就會進入無法預期的結果。(譯註:到底是會有誰想要寫這種 code)

5. 使用非十進位的數字

使用 8 進位的數字來初始化變數看起來會是很像使用 10 進位數字,差別只在於 8 進位數字是以 “0” 做為開頭。
你的同事可能會說你這樣做是混蛋的行為,但你可以堅持宣稱 8 進位數字的運算比較快因為所有的位元都很自然的以 8bis 群組來儲存。
譯註: 這我又不懂了,哪一個基本資料形態不是 8bits 群組? 又初始化過後的數字運算跟用來初始化的資料表示法有關嗎?

6. 空白字元(廣義的)不重要?只有在它真的不重要的時候

大家都知道空格跟分號在 JavaScript 中並非是必須的。錯!不要把這個是為理所當然。看看一下這段碼:

這段碼中,看起來似乎少了一個分號,但其實是刻意的。這樣一來 d / e / f 就不是屬於 local scope 而會被解讀為 window 的 property,因此你就可以在任何地方使用這幾個變數了。並且一旦有人嘗試要修復的話大概要花一段時間才會搞清楚。
譯註:如果是有心想要防止源碼被有心人士修改的話,這招是不錯。不然這基本上都違反寫 code 的基本準則:要有可讀性啊。

7. 要有創意

程式設計不脫創意,而創意大部分都來自模仿(或剽竊)他人的。不要懼怕去偷別人的 code 或是 idea,也別指控別人偷竊你的 idea。不然你知道其實 jQuery 是剽竊 Prototype 嗎?這是真的!
譯註:此篇文章有些偏頗,大部份都是非正規的想法,請自行斟酌。
(資料來源:CSS Perverts)



Comments
  1. Tomky
    回覆
  2. Sean Lin
    回覆

Leave a Reply

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *