博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《编写高质量代码--改善JavaScript程序的188个建议》学习记录(二)
阅读量:7121 次
发布时间:2019-06-28

本文共 2624 字,大约阅读时间需要 8 分钟。

hot3.png

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;
}
}

转载于:https://my.oschina.net/sunshinewyf/blog/618879

你可能感兴趣的文章
Java IO --ByteArrayOutputStream (六)***
查看>>
C++中的inline的用法
查看>>
Ubuntu 16.04升级Linux内核为4.7.0最快的方法
查看>>
map-DBA-comands
查看>>
小目标 | 4周学会用邮箱管理时间和工作流-分类邮件
查看>>
决策树分类
查看>>
(转)Springboot 中filter 注入对象
查看>>
Android设置ScrollView回到顶部的三种方式 (转)
查看>>
通过六个题目彻底掌握String笔试面试题
查看>>
SPLIT_STR
查看>>
showmemory.c 和 hello.s 源码
查看>>
hadoop之 hadoop 机架感知
查看>>
腾讯云分布式数据库可用性系统实践
查看>>
百度地图api2.0体验
查看>>
看视频 shell入门视频补充的 shell脚本基本知识(TMD有点乱)
查看>>
2017iOS开发最新的打包测试步骤(亲测)
查看>>
Solve Error: Unhandled exception at 0x00905a4d in xxx.exe: 0xC0000005: Access violation.
查看>>
透明代理、匿名代理、混淆代理、高匿代理有什么区别?
查看>>
细说WebSocket -- Node.js篇
查看>>
MDD Cup 2017 小记
查看>>