《编写高质量代码--改善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;
}
}













你可能感兴趣的:(《编写高质量代码--改善JavaScript程序的188个建议》学习记录(二))