2011年12月27日 星期二

[筆記]Javascript Patterns 一些好習慣 -- for loops

for Loops

1: // sub-optimal loop

   2: for (var i = 0; i < myarray.length; i++) {
   3:     // do something with myarray[i]
   4: }
   5:  
   6: //應使用下面的寫法
   7: for (var i = 0, max = myarray.length; i < max; i++) {
   8:     // do something with myarray[i]
   9: }

如果要套上剛剛所說的 single var 的寫法的話



   1: function looper() {
   2:     var i = 0,
   3:         max,
   4:         myarray = [];
   5:     // ...
   6:     for (i = 0, max = myarray.length; i < max; i++) {
   7:         // do something with myarray[i]
   8:     }
   9: }

還可以更簡單嗎?? 下面只用到兩個變數



   1: function foo(){
   2:     var myarray = [],
   3:         i = myarray.length;
   4:     while(i--){
   5:         // do something with myarray[i]
   6:     }
   7: }


for-in Loops



for-in loops 大部份是用在不是 array 的物件身上,雖然也可以用在 Array 上,但並不建議。


在使用上可以用 hasOwnProperty(i) 來過濾物件屬性。如下面的  code 該物件有一個 clone() 的 function,就可以用 hasOwnProperty 來將其濾除



   1: // the object
   2: var man = {
   3:     hands: 2,
   4:     legs: 2,
   5:     heads: 1
   6: };
   7: // somewhere else in the code
   8: // a method was added to all objects
   9: if (typeof  Object.prototype.clone === "undefined") {
  10:     Object.prototype.clone = function () {};
  11: }
  12:  
  13: // 1.
  14: // for-in loop
  15: for (var i in man) {
  16:     if (man.hasOwnProperty(i)) { // filter
  17:         console.log(i, ":", man[i]);
  18:     }
  19: }
  20: /*
  21: result in the console
  22: hands : 2
  23: legs : 2
  24: heads : 1
  25: */
  26: // 2.
  27: // antipattern:
  28: // for-in loop without checking hasOwnProperty()
  29: for (var i in man) {
  30:     console.log(i, ":", man[i]);
  31: }
  32: /*
  33: result in the console
  34: hands : 2
  35: legs : 2
  36: heads : 1
  37: clone: function()
  38: */

 

不要用 eval()


這個應該不用多說, eval 會有潛在的安全性問題。


parseInt() 的注意事項


如果使用者輸入日期格式的文字在要 parseInt 的值時,在 舊版本的 javascript 會將該文字當作 8 進位來計算,會造成錯誤。所以在用 parseInt 時要指定 radix 的值



   1: var month = "06",
   2:     year = "09";
   3: month = parseInt(month, 10);
   4: year = parseInt(year, 10);

在大多數的狀況下也可以用下面的方式



   1: +"08" // result is 8
   2: Number("08") // 8

雖然速度會比較快一點,不過因為 parseInt 還做了 parse 的動作,所以像 “08 hello” 這樣子的文字還是可以正常的 parse 出來,而 用上面方法的就只會回傳 NaN 了

沒有留言: