前端冷知識(一)12種不宜使用的Javascript語法

  1. ==
    Javascript有兩組相等運算符,一組是==和!=,另一組是===和!==。前者只比較值的相等,後者除了值以外,還比較類型是否相同。
    請儘量不要使用前一組,永遠只使用===和!==。因爲==默認會進行類型轉換,規則十分難記。如果你不相信的話,請回答下面五個判斷式的值是true還是false:
      false == ‘false’
      false == undefined
      false == null
      null == undefined
      0 == ”
    前三個是false,後兩個是true。
  2. with
    with的本意是減少鍵盤輸入。比如
      obj.a = obj.b;
      obj.c = obj.d;
    可以簡寫成
      with(obj) {
        a = b;
        c = d;
      }
    但是,在實際運行時,解釋器會首先判斷obj.b和obj.d是否存在,如果不存在的話,再判斷全局變量b和d是否存在。這樣就導致了低效率,而且可能會導致意外,因此最好不要使用with語句。
  3. eval
    eval用來直接執行一個字符串。這條語句也是不應該使用的,因爲它有性能和安全性的問題,並且使得代碼更難閱讀。
    eval能夠做到的事情,不用它也能做到。比如
      eval(“myValue = myObject.” + myKey + “;”);
    可以直接寫成
      myValue = myObject[myKey];
    至於ajax操作返回的json字符串,可以使用官方網站提供的解析器json_parse.js運行。
  4. continue
    這條命令的作用是返回到循環的頭部,但是循環本來就會返回到頭部。所以通過適當的構造,完全可以避免使用這條命令,使得效率得到改善。
  5. switch 貫穿
    switch結構中的case語句,默認是順序執行,除非遇到break,return和throw。有的程序員喜歡利用這個特點,比如
      switch(n) {
        case 1:
        case 2:
          break;
      }
    這樣寫容易出錯,而且難以發現。因此建議避免switch貫穿,凡是有case的地方,一律加上break。
      switch(n) {
        case 1:
          break;
        case 2:
          break;
      }
  6. 單行的塊結構
    if、while、do和for,都是塊結構語句,但是也可以接受單行命令。比如
      if (ok) t = true;
    甚至寫成
      if (ok)
        t = true;
    這樣不利於閱讀代碼,而且將來添加語句時非常容易出錯。建議不管是否只有一行命令,都一律加上大括號。
      if (ok){
        t = true;
      }
  7. ++和–
    遞增運算符++和遞減運算符–,直接來自C語言,表面上可以讓代碼變得很緊湊,但是實際上會讓代碼看上去更復雜和更晦澀。因此爲了代碼的整潔性和易讀性,不用爲好。
  8. 位運算符
    Javascript完全套用了Java的位運算符,包括按位與&、按位或|、按位異或^、按位非~、左移<<、帶符號的右移>>和用0補足的右移>>>。
    這套運算符針對的是整數,所以對Javascript完全無用,因爲Javascript內部,所有數字都保存爲雙精度浮點數。如果使用它們的話,Javascript不得不將運算數先轉爲整數,然後再進行運算,這樣就降低了速度。而且”按位與運算符”&同”邏輯與運算符”&&,很容易混淆。
  9. function語句
    在Javascript中定義一個函數,有兩種寫法:
      function foo() { }

      var foo = function () { }
    兩種寫法完全等價。但是在解析的時候,前一種寫法會被解析器自動提升到代碼的頭部,因此違背了函數應該先定義後使用的要求,所以建議定義函數時,全部採用後一種寫法。
  10. 基本數據類型的包裝對象
    Javascript的基本數據類型包括字符串、數字、布爾值,它們都有對應的包裝對象String、Number和Boolean。所以,有人會這樣定義相關值:
      new String(“Hello World”);
      new Number(2000);
      new Boolean(false);
    這樣寫完全沒有必要,而且非常費解,因此建議不要使用。
    另外,new Object和new Array也不建議使用,可以用{}和[]代替。
  11. new語句
    Javascript是世界上第一個被大量使用的支持Lambda函數的語言,本質上屬於與Lisp同類的函數式編程語言。但是當前世界,90%以上的程序員都是使用面向對象編程。爲了靠近主流,Javascript做出了妥協,採納了類的概念,允許根據類生成對象。
    類是這樣定義的:
      var Cat = function (name) {
        this.name = name;
        this.saying = ‘meow’ ;
      }
    然後,再生成一個對象
      var myCat = new Cat(‘mimi’);
    這種利用函數生成類、利用new生成對象的語法,其實非常奇怪,一點都不符合直覺。而且,使用的時候,很容易忘記加上new,就會變成執行函數,然後莫名其妙多出幾個全局變量。所以,建議不要這樣創建對象,而採用一種變通方法。
    Douglas Crockford給出了一個函數:
      Object.beget = function (o) {
        var F = function (o) {};
        F.prototype = o ;
        return new F;
      };
    創建對象時就利用這個函數,對原型對象進行操作:
      var Cat = {
        name:”,
        saying:’meow’
      };
      var myCat = Object.beget(Cat);
    對象生成後,可以自行對相關屬性進行賦值:
      myCat.name = ‘mimi’;
  12. void
    在大多數語言中,void都是一種類型,表示沒有值。但是在Javascript中,void是一個運算符,接受一個運算數,並返回undefined。
      void 0; // undefined
    這個命令沒什麼用,而且很令人困惑,建議避免使用。
發佈了61 篇原創文章 · 獲贊 10 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章