UglifyJS-- 對你的js作了什麼

也不是閒着沒事去看壓縮代碼,但今天調試本身代碼的時候發現有點意思。由於是本身寫的,雖然壓縮了,格式化以後仍是很好辨認。固然做爲min的首要準則不是可讀性,而是精簡。那麼它會盡可能的縮短代碼,儘可能的保持一行,最大化的減小的空白。咱們經常使用的分號都會被替換成了逗號,短句變成了連貫的長句。函數

1.當即執行函數

我本是第二種寫法,uglify給我替換成了第一種(固然更短一點)。其實括號和!號的做用都是將funtion的部分轉成一個表達式,而再也不是申明。這樣就能當即執行,同理~   +均可以作到。

2.變量名替換

這個是天然的,函數名、參數名、變量名都替換成了單個字母。甚至是‘_’

3.函數置頂

function foo (){} 這種形式的代碼都會被放到模塊的最頂端。固然這是一種規範,後來發現還有另一個做用就是方便後面的代碼合併。 好比 咱們這樣定義:
var self=this;
function a(){}
self.a=a;
function b(){}
self.b=b;
return self;

會替換成:this

function a(){}
function b(){}
var s={}
return  s.a={},s.b={},s

注意到最後的s 不能漏了,return會以最後一個表達式的結果爲準。編碼

  function rt(n) {
    return n;
   }
  function xx() {
      return rt(1), rt(2);
  }

執行xx()獲得的是2,若是 rt(2)後面還有個不返回值的函數執行,那麼xx()會獲得undefined。spa

4.bool值替換

false-->!1  true-->!0

5.if 

if語句是壓縮最多的地方。調試

1) return 前置:
 function load() {
            if (t) {
                x = false;
                log("error");
                return;
            }
            console.log("22")
        }

好比個人原函數大概是這樣。壓縮後成了這樣:code

  if (t) return x =!1,void log("error")
return提早了,末尾多了一個void。 這是爲何呢。 沒有大括號,if的四段代碼變成了一句話。void的在這裏的做用是抹掉函數的返回值。由於原本的這個if 是沒有返回值的 。若是這個時候log方法帶有返回值。那麼調用load就會拿到這個返回值。這會產生干擾,違背了原函數的本意。因此用void抹掉了。 
2) 短路
     function foo() {
            if (!x) {
                return;
            }
            console.log("doA");
            console.log("doB");
  }

壓縮後:blog

    function f() {
            x || console.log("doA"), console.log("doB");
      }

這樣蠻不錯的。同理:io

if(x&&y){
doa();
dob();
}
doc();
--> x&&y&&(doa(),dob()),doc()

本來四行變成了一行代碼。console

3).爲了合併一行,這也行:function

    console.log("doA");
    console.log("doB");
     if (x>0) {
         console.log("true");
      }

合併成這樣:

 if (console.log("doA"), console.log("doB"), x > 0) console.log("true");

平時這麼寫可能不太友好,重點是在if語句中,最後一句纔是判斷句。結合以前的return。想必對逗號語句有了深入的認識。

4)throw也不放過

 if (errMsg) {
       util.triggerCallback(fail, "模型驗證錯誤");
       throw Error(errMsg);
  }

壓縮後:

 if (a)  throw x.triggerCallback(o, "模型驗證錯誤"), Error(a)

調換了語句的順序,把throw當作return 就明白了。

5) if else

這個會替換成三元表達式  a?b:c 。

6.數字處理

整百整千的會處理成科學計數 1000 -->1e3 。

7. while

var offset = 0;
            while (true) {
                if (offset >= bufferLength) {
                    break;
                }
}

會替換成這樣:

  for (var n = 0; ; ) {
                if (n >= K)
                    break
 }

確實不錯,節省了一行代碼。

以上只是獨自對比本身的代碼發現的一些東西,有的能夠在平時的編碼中用起來,固然不是追求全部代碼都寫成一行,這樣可讀性比較差,另外可能你下次看壓縮代碼就不那麼費勁了。歡迎補充。

相關文章
相關標籤/搜索