《編寫高質量代碼--改善JavaScript程序的188個建議》學習記錄(二)

Js中的數組
(一)數組類型檢測的方法
因爲用typeof來檢測數組類型,獲得的是「object」,因此根本不能真正準確地檢測出數組類型,能夠自定義下面一種方法:
var is_array = function(value){
    return value &&  typeof value === "object" && value.constructor === Array;
 };
 可是,上面的函數在識別從不一樣的window或者frame中構造的數組時會失效,要想準確地檢測外部數組類型,還須要進一步地完善該函數
 var is_array = function(value){
   return value &&
   typeof value === 'object' &&
   value.constructor === Array &&
   typeof value.length === 'number' &&
   typeof value.splice === 'function' &&
   !(value.propertyIsEnumerable('length'));
};
下面這種方法也能夠檢測出來,並且更加簡潔:
var is_array = function(value){
    return Object.prototype.toString.apply(value) ==='[object Array]';
};

(二)刪除數組元素的方法
刪除數組元素有方法有不少種,最簡單的方法就是利用length屬性來截斷數組,可是這種方法比較笨拙,僅可以在尾部截斷數組元素,在JavaScript中,因爲數組其實就是對象,所以使用delete運算符能夠從數組中移除元素。
例如:var number = [1,2,3,4,5,6];
      delete number[2];  //1,2,undefined,4,5,6
 這種刪除數組的方法,只能刪除指定位置下標的元素,而且會在數組中遺留一個空洞,這是由於排在被刪除元素以後的元素僅保留了它們最初的名字(下標位置),而咱們一般須要後面元素的下標值能夠依次減一,也就是向前排一位。
 這種效果能夠用splice方法來實現,splice方法的第一個參數是數組中的一個序號,第二個參數是要刪除的元素個數,任何額外的參數都會在序號那個點的位置被插入到數組中,例如:
 var number = [1,2,3,4,5,6];
 number.splice(2,1);//1,2,4,5,6
 (三)數組的排序函數sort()
 按從小到大進行排序數組:
 function f(a,b){
              return a-b;
          }
          var arr = [1,2,3,4,5,6];
          arr.sort(f);
按從大到小對數組進行排序:
function f(a,b){
              return b-a;
          }
          var arr = [1,2,3,4,5,6];
          arr.sort(f);

實現偶數排在前面,奇數排在後面:
   function f(a,b){
                     var a = a % 2;
                     var b = b % 2;
                     if(a==0)  return -1;
                     if(b==0)  return 1;
              }
              var arr = [1,4,5,6,1,3,7,8];
              arr.sort(f);
              console.log(arr);
    若須要奇數排在前面,偶數排在後面:
     function f(a,b){
                     var a = a % 2;
                     var b = b % 2;
                     if(a==0)  return 1;
                     if(b==0)  return -1;
              }
              var arr = [1,4,5,6,1,3,7,8];
              arr.sort(f);
              console.log(arr);
   不區分字母大小進行排序:
   function f (a,b){
   var a = a.toLowerCase;
   var b = b.toLowerCase;
   if(a < b){
     return;
   }else{
   return -1;
}
}
var arr = ["aB","Ab","Ba","bA"];
arr.sort(f);

(四)數組的下標
  在JavaScript中,數組下標不必定必須是大於或者等於0的整數,能夠爲任意表達式,甚至能夠是任意類型數據,可是使用length屬性檢測的時候,返回值爲0,說明數組並無增長長度,可是使用數組下標仍然能夠獲得相應的數組元素值,例如:
  var a = [];
  a[name] = 'Tom';
  alert(a.length); // 0
  alert(a[name]); // Tom
(五)使用arguments模擬重載
在javas中,每一個函數內部均可以使用arguments對象,該對象包含了函數被調用時的實際參數值,arguments對象雖然在功能上和數組有些相似,可是它不是數組,arguments對象與數組的相似體如今他有一個length屬性,同時實際參數的值能夠經過[]操做符來獲取,可是arguments對象並無數組可使用的push,pop,splice等方法,其緣由是arguments對象的prototype只想的是object.prototype,而不死Array.prototype.
 其餘語言都支持方法重載,可是JavaScript並不支持這種方式的重載,這是由於JavaScript中的function對象也是以屬性的形式出現的,在一個對象中增長與已有function同名的新function時,舊的function對象會被新的覆蓋,不過能夠經過使用arguments來模擬重載,其實現機制是經過判斷arguments中實際參數的個數和類型來執行不一樣的邏輯。
 例如:
 funtion sayHello(){
   switch(arguments.length){
     case 0:
      return "hello";
      break;
     case 1:
      return "hello"+ arguments[0];
      break;
     case 2:
      return "hello"+ arguments[0] + arguments[1];
      break;
}
}













java

相關文章
相關標籤/搜索