天天看點

javascript 程式設計技巧

1.巧用判斷:

  在js中,NaN,undefined,Null,0,"" 在轉換為bool的時候,是false,是以,可以這樣寫。

if(!obj)  {}      

表示一個對象如果為false的時候所做的事情,因為如果obj為以上任何一個,那麼就是false,!false即是true,這樣,就不需要 if(obj==null || obj == NaN ....)。

2.巧用運算符:

   有一個很經典的技巧,得到時間戳。

var dataspan = new Date()*1;      

我們知道,js是弱類型語言,Date()會傳回一個表示時間的字元串,用這個字元串進行算術運算,将得到轉換,也就是結果的時間戳。

3.巧用正規表達式:

/.a/ig.exec('xsas')      

//相當于建立一個reg對象,調用了exec方法,當然也能調用其他的方法,如:test()等。

4.取數組最大值和最小值:

var values = [1,2,3,40,23]; 
var max = Math.max.apply(Math,values);      

調用Max.apply,設定對象的為Math,然後傳遞一個Values,就能确定最大值。

5.記憶體優化:

javascript 程式設計技巧
function p(){this.p='moersing'}; var p1 = new p();  

   p1.xx 

   p1.xx

   .......
      
p1=null;  //執行完操作之後,最後手動解除對p1的引用。      
javascript 程式設計技巧

6.最受歡迎的建立對象方式(原型模式):

javascript 程式設計技巧
function c(){

    this.name ='moersing';

    this.age=18;

    this.books=['javascript develop','C# develop'];

  }

  c.prototype={ 
       displayBookName:function (){ 
        foreach(var t in this.books) 
        {
           document.write(this.books[t]);
        }
    }
}      
javascript 程式設計技巧

原型構造模式的最大缺點在于引用類型的共享,是以,将引用類型定義在構造函數中,而将通用方法定義在原型中,使用this引用。

7.塊級作用域和私有變量

    在javascript中,沒有塊級作用域和私有變量這一說,但是,利用一些特性,則能模仿這些效果。

7.1塊級作用域:

(function(){ 

      //塊級作用域      
}
)();      

    匿名函數外面加上一個括号,我管它叫"函數标準化",也就是說,可以像标準函數那樣調用,如:

var name =function(){};
(name)();//一般不會這麼寫;</P>      

這麼做的好處就是,在()外部無法通路到函數中變量,也就成了塊級作用域,這種方式一般用在編寫插件的時候,不會再全局 (global)中添加額外的變量,而且,在函數執行完畢之後,其内部定義的變量就被銷毀了,是以,也不會有閉包特性存在的問題。

7.2私有變量:

javascript 程式設計技巧
function private()
 { 
   var name = 'moersing';
   this.getName = function(){
   return this.name;      
}
}      
javascript 程式設計技巧

私有變量實際上就是利用函數的作用域作為限制(外部無法通路),然後定義一個方法,這個方法傳回相應的變量,僅此而已。

8.DOM之NodeList:

   nodeList是一個動态的元素,這意味着,在文檔中添加任何元素,nodeList都會實時更新,如:

javascript 程式設計技巧
var alldiv = document.getElementsByTagName('div');

    for(var i=0;i<alldiv.length;i++)
    {
        var div = document.createElement('div');

        div.innerHTML= i.toString();

        document.body.appendChild(div);
    }      
javascript 程式設計技巧

這段代碼會造成無限循環,在循環裡面建立了一個div,然後appendChild方法将其添加到body中,那麼,所有alldiv會立即就更新,是以,i<alldiv.length永遠無法成立,要解決這個問題,可以使用下面方式:

javascript 程式設計技巧
var alldiv = document.getElementsByTagName('div');

    var len,i;

    for(i=0,len=alldiv.length;i<len;i++)
    {
        var div = document.createElement('div');

        div.innerHTML= i.toString();

        document.body.appendChild(div);

    }      
javascript 程式設計技巧

這裡建議:最好不要頻繁的對NodeList操作,因為每次操作都會執行一次DOM樹的查詢。

  除了以上介紹的方法外,HTML5 新加入的API(selector API Level1)也能解決這個問題,它類似C#的linq及時查詢,至于什麼是linq及時查詢,以後我會更新blog,敬請關注: 

javascript 程式設計技巧
var allDiv= document.querySelectorAll('div');

    for(var i=0;i<alldiv.length;i++)
    {
        var div = document.createElement('div');

        div.innerHTML= i.toString();

        document.body.appendChild(div);

    }      
javascript 程式設計技巧

   querySelectorAll需要一個參數,一個CSS選擇器,類似jquery中的$(),它傳回的NodeList是一個及時的,非動态的DOM集合。

   另外還有一個querySelector,傳回比對的第一個元素,有關HTML5 API 詳 見

http://www.w3.org/standards/techs/dom#w3c_all 

或者

 https://developer.mozilla.org/zh-CN/docs/Web/API

另外,本人也在醞釀一篇blog,專門講HTML5 API的,敬請關注。

9.DOM性能:

    不要做這種傻事(我做過。。。)

for(var i=0;i<10;i++)
    { 
       document.querySelector('ul').innerHTML="<li>"+i+"</li>";
    }      
javascript 程式設計技巧
var ih=null;

for(var i=0;i<10;i++)
 { 
    ih+="<li>"+i+"</li>";
 }

  document.querySelector('ul').innerHTML=ih;      
javascript 程式設計技巧

繼續閱讀