Javascript平常編碼中的一些常見問題

1、儘可能少用全局變量
   這是一個疑問最少,同時流傳最 廣的一條.Javascript使用函數管理做用域,全局變量最大的問題在於同名變量衝突.這種隱患產生比較直接的兩個緣由就是Javascript語言的特性形成的,即變量不用聲明就能夠直接使用以及變量不經過var直接使用則默認定義爲全局變量.
 function fun(){
   var a=b=0; //a是局部變量,b是全局變量
  }

2、變量釋放時是有反作用的 
  在Javascript中你能夠經過delete操做將對象屬性刪除或者說撤銷.使用var建立的全局變量不能經過delete刪除,沒有使用var的隱含式全局變量能夠經過delete刪除.若是這麼說你不能理解,那麼再進一步說隱含式的全局變量嚴格來說不是真意義的全局變量,而是全局對象的屬性,屬性能夠經過delete 刪除,單變量不行。
面試

 

3、全局變量的訪問
  並不全部的狀況下都能經過window對象訪問到全局對象,若是它不叫window對象了,咱們能夠經過另外一種方式取到全局對象:

  var gloabl = (function(){
   return this;
  }());

通常來說,this在函數內部做爲一個函數調用時,每每指向全局對象.
數組

4、單一var變量聲明
  function fun(){
    var a = 1,
        b = 2,
        c = 3,
        d = {},
        e,
        f;
   }
這麼作的好處在於:
(1)提供單一的地址以查找函數所須要的全部局部變量.
(2)在頂部聲明,防止出現未聲明就是用的錯誤邏輯.
(3)更少的編碼,更直觀顯示定義好的變量.
函數

5、變量的"提高"問題
  這類問題我常常在不少公司的面試題裏看到,用來考察最做用域以及變量聲明的理解.不過這裏咱們要看一點更實在的問題.
所謂的變量提高,這裏提高的僅僅是聲明.在Javascript中不管在哪裏聲明,效果都等同於在函數頂部聲明,可是若是使用在聲明以前可能會致使邏輯的錯誤.這裏不得不舉一個很常見的例子:
  name = "global";
  function fun(){
    alert(name);
    var name = "local";
    alert(name);
  }
  fun();
  // undefined
  // local

這裏你要區分開聲明和賦值是兩個動做,被"提高"的僅僅是聲明.
this

代碼處理上分了兩個階段:
   第一階段建立變量、函數聲明以及形參.這是解析和進入上下文的階段;
   第二個階段是代碼運行時,執行過程以及建立函數表達和不合格標識符;
因此在 ECMAScript其實沒有"提高"的概念,這是一種表述.編碼

6、for循環
  for (var i = 0,len=arr.length-1; i < len; i++) {
  };

  每次循環不要老是從新計算集合總長,尤爲是DOM元素集合時.另一點是推薦逐步減到0的循環,即i--,由於同0比較要快於同數組長度比較.
spa

7、循環的差別以及hasOwnProperty()
  在Javascript的通常使用上,for和for in可能沒有結果上的不一樣,不過仍是推薦遍歷數組時使用for,若是遍歷的是對象屬性則使用for in.這裏有一個小坑就是遍歷對象屬性來過濾遇到的原型鏈屬性時,使用hasOwnProperty()方法是很重要的.
prototype

看看代碼就明白我說的意思了:對象

 var obj = {
      a:1,
      b:2,
      c:3
    };
    if(typeof Object.prototype.clone === "undefined"){
      Object.prototype.clone = function(){
      }
    }
    for(key in obj){
      console.log(key);
    }

 

這裏輸出的結果中會有clone,但其實不少時候咱們是不想要原型鏈上的屬性的,此時就能夠經過hasOwnProperty()過濾掉原型鏈上的屬性.

  for(key in obj){
   if(obj.hasOwnProperty(key)){
    console.log(key);
   }
  }

8、不要增長內置的原型
   增長內置構造函數的原型是頗有誘惑的,方便的同時也會帶來維護以及協做上難以預知的風險.相似Object()或者Array()等都是不可取的.若是有相似的須要能夠經過原型增長屬性的方式實現,我常常作的就是爲Array增長remove的function.
ip

  if (typeof Array.prototype.remove === "undefined") {
   Array.prototype.remove = function(){
   }
  };

9、勿忘JS隱式類型轉換,儘可能避免

  由於JS的弱類型特性,因此對於數據類型的肯定並不規範.在使用比較語句時會執行隱式類型轉換,因此當執行false==0或者""==0這種比較會返回true.因此當要進行比較的時候應該儘可能使用===或者!===操做符來保證徹底匹配.
ci

10、不要省略parseInt()的參數
  parseInt()的第二個參數是一個進制參數,一般能夠忽略,可是最好不要這樣作.由於當解析的字符串是0開頭的就會報錯.並且ECMA3和ECMA5對此的處理標準還不同,因此爲了不不可預知的問題,最好是加上禁止參數.

  最後還有一些很是隱晦的坑,點出來只能經過你們本身注意了.編碼規範,好比空格,縮進,大括號位置等,方法以及變量命名規則,這個只有等你後來維護代碼的時候纔會發如今沒有完整註釋以及文檔的狀況下,好的命名是多麼重要.

相關文章
相關標籤/搜索