js数组的常见知识

来源:互联网 发布:地下城与勇士内存优化 编辑:程序博客网 时间:2024/05/21 19:47
一、数组基本考点:

1、数组的索引范围是0~(2的32次方-2);
2、用数组索引访问元素要比访问常规对象的属性要快

二、稀疏数组

    创建稀疏数组     1、var arr = new Array(5);
                            2、var arr1=[,,,];
                            3、arr2[1000] = 1;
                            4、用delete操作符来创建稀疏数组

三、数组的添加与删除

添加
1、通过数组的length属性,arr[arr.length]=newvalue;
2、push()在数组的尾部进行元素添加(一个或多个元素),返回的是数组的length值
3、unshift()在数组头部进行元素添加(一个或多个元素),返回的是数组的length值
4、concat() 详解见下方
5、splice() 详解见下方

删除
1、设置相应的length值小于当前length值,已达到删除元素的目的
2、delete arr[1]  //delete运算符删除
3、pop()删除数组最末尾元素,返回的是删除的元素
4、shift()删除数组的首位元素,返回的是删除的元素

*注:delete并不会影响数组的length值,也不会改变元素的索引值,而是把数组变成稀疏数组 而push/pop和unshift/shift会改变数组长度和索引值

四、数组的遍历

数组遍历可以用for循环,但不适合用for/in循环,因为for/in可以遍历出继承的属性,除非使用检测方法arr.hasOwnProperty(i)过滤掉非自有属性

在遍历的时候最好优化把数组长度存到一个变量中,不要每次都去查询

1、跳过不存在的值(过滤掉稀疏数组不存在值)
     for(var i=0,len = arr.length;i<len;i++){
          if( ! (i in arr) ) continue;
          //循环体
}
2、跳过null、undefined和不存在的值
     for(var i=0,len = arr.length;i<len;i++){
          if(!arr[i]) continue;
          //循环体
}
3、forEach()(最常用,详见下方 中)

注:js不支持多维数组,但可以用数组中存放数组的方式来模拟多维数组(例如打印99乘法表)

五、数组常用方法

1、join()   
将数组中元素转化成字符串,该方法可以接受一个参数,该参数指定各个数组元素之间分割的符号,不写默认是以逗号分开
eg:var arr = [1,2,3];
arr.join();          // "1,2,3"
arr.join("@");    // "1@2@3"

注:与该方法相对的是   String.split() ,该方法是将字符串分割成若干块来组成数组


2、reverse()
将数组倒序输出,返回仍然是数组,并且它是在原来的数组上进行替换,并不会创建新的数组。(原来的数组也改变了)

3、sort()
将数组进行排序,并返回排序后的数组,不传参数默认按字母顺序排序(即11将排在2前面),不然就传一个匿名比较函数,比较函数接受两个参数a,b,如果该函数返回负数,则a排在b前面(a小于b),返回0,则相等,返回大于0的数,则a排在b后面。

注:如果有undefined,它排在最后

4、concat()
创建一个新数组,包含调用它的数组元素和它的参数
eg:var arr = [1,2,3];
arr.concat(4,5);  //[1,2,3,4,5]

5、slice()
截取数组片段,最多接收两个参数,截取的起始位置和结束位置,负数表示相对于数组最后一个元素的位置

6、splice()   (会改变原来调用它的数组)
删除或插入元素,返回删除掉的元素组成的数组,并且改变原数组的索引值,所以原数组的索引值还是连续的

接收两个参数,第一个参数表示删除或插入的位置,第二个参数表示删除元素的个数,如果不指定则删到数组末尾(如果没有删除元素则赶回空数组),后面紧随的若干个参数表示的是要插入的新元素,插入位置则有第一个参数决定

7、push()和pop()详见上方

8、toString()和toLocalString()
toString将数组的每个元素转化成字符串并由逗号分隔显示的字符串列表(类似方括号等的包裹符都不包括在字符串内),该方法与不传参的join()方法一样

六、es5定义9个数组方法

注:大多数方法概述,首先大多数方法第一个参数接受一个函数并对数组的每个元素调用一次该函数,(稀疏数组不存在的元素则不进行调用)一般该函数接受三个参数(数组元素、数组元素索引、数组本身),一般忽略后两个参数,方法的第二个参数是可选的,如果有则调用的函数被看做第二个参数的方法,即方法的第二个参数等价于调用函数里的this关键字

1、forEach() 遍历数组(没有返回值)

它不会再遍历所有元素之前终止遍历,它没有for循环中那种break语句,所以想终止它的遍历,就需要把forEach放在try、catch中(目前不太明白怎么用

2、map() 将调用它的数组的每个元素传递给指定的函数,并返回一个新的数组,包含函数的返回值,它并不会改变原来调用它的数组(应有返回值)

3、filter() 它也有返回值,它的返回值是调用它的数组的子集,传递给该方法的函数是用来进行逻辑判定的,该函数返回true/false或能转化为true/false的值,如果返回true,则传递给判定函数的元素是该方法的返回值的成员

eg:var a = [1,2,3,4,5];
var b = a.filter(function(x){ return x<3}); //b is [1,2]

注:filter会跳过稀疏数组,它返回的始终是稠密数组,可以用它来压缩数组  var choumi = xishu.filter(function(x){return true; })
    也可以排除数组中的undefined和null    var yange = arr.filter(function(x){ return x!==undefined&&x!=null;})

4、every()和some() 同样是对数组元素的逻辑判定,返回true/false

every()是对调用它的数组中的所有元素都进行判定,所有元素都返回true时,它才会返回true
eg:var a = [1,2,3];      a.every(function(x){return x<5;});      //返回true

some是‘ 存在‘,只要存在为true的元素它就返回true

注:这俩方法确定了返回值时就会停止遍历  
      在空数组上every()返回true    some()返回false

5、reduce()和reduceRight()使用指定函数将数组元素进行组合生成单个值,在函数式编程中叫做‘注入’和‘折叠’

eg: var a=[1,2,4];
     var sum = a.reduce(function(x,y){return x+y;},0);    //返回数组之和
reduce接受两个参数,第一个是化简函数,第二个是化简函数的初始值,第二个参数省略时,就把数组的第一个元素当做初始值,与第二个元素进行运算

注:在空数组上,不带初始值调用reduce()会抛出类型错误异常,(如果空数组调用它且有初始值则会返回这个初始值,如果只有一个元素的数组调用它并且不给初始值则返回这个元素   这两种情况reduce就不会调用化简函数了)

reduceRight() 与reduce一样,只是它是从右到左进行操作,即数组的索引从高到低      

他俩也同样接受第三个参数,用来代指化简函数的this

6、indexOf()和lastIndexOf()
接受两个参数,第一个为要搜索的值,第二个可选(要搜索的索引值),lastIndexOf从后往前找











0 0
原创粉丝点击