首页 > 技术文章 > JavaScript数组基本用法

djlxs 2016-04-20 21:35 原文

其实数组,字符串等等都是在刚开始学js的时候就开始接触了,那个时候只是进行了简单的API学习,甚至连API都还没能够记住。经过几次这样的痛苦折磨,终于决定来写一篇博文来强化一下记忆,当然里面会加入一些自己的理解。

1 稀疏数组

至于如何创建数组,创建数组有哪几种方式,我在这里就不在叙述。首先来讲讲什么是稀疏数组。

稀疏数组就是包含从0开始的不连续索引的数组,通常稀疏数组的长度length属性值会大于数组的元素的个数。举个例子

     //如何产生稀疏数组
        var arr04=[];
        arr04[9]=1;
        alert(arr04.length)   //10
        alert(arr04[1]);      //undefined
        alert(1 in arr04);    //false

例子中我们定义了一个空数组,然后指定了arr04[9]=1,此时数组的length属性值是10,但是数组的元素个数只有1个,因为当我们用in来判断索引1处是否有元素返回的是false。没有元素默认返回的是undefined。当然如果是下面这样,会返回true。

     var arr03=[0,1,2,3,null,undefined];
        alert(4 in arr03);//判断索引4是否有值,即使该索引存入的值是null和undefined也会返回true
        alert(5 in arr03);

 即使该索引存入的值是null和undefined也会返回true。

好了关于稀疏数组就说这么多,关于稀疏数组有什么用,什么地方会用到,小弟才疏学浅,目前不得而知。

2 删除数组元素

数组元素删除有4种方法:delete 操作符 、pop() 、shift()和splice()。而delete不会改变元素组的长度,只是把原数组变成了稀疏数组。而pop()和shift()都会直接改变数组的长度。splice()后面再讲。

而pop()方法是删除数组最高索引所指向的元素,shift()是删除最低索引所指向的元素即arr[0]。见例程:

        var arr05=[0,1,2,3];
        console.log(arr05.length+"---"+arr05);//4---0,1,2,3
        delete arr05[1];
        console.log(arr05.length+"---"+arr05);//---0,,2,3
        alert(1 in arr05)  //false
     var arr05=[0,1,2,3];
        arr05.pop()      
        console.log(arr05.length+"---"+arr05);  //3---0,1,2   删除数组最后一个元素,长度会减一
       var arr05=[0,1,2,3];
        arr05.shift()      
        console.log(arr05.length+"---"+arr05);  //3---1,2,3   删除数组第一个元素,长度会减一

3 数组遍历

相信最先想到得就是利用for循环,这也确实是一种不错的方法,这里就不在举例。

如果想利用这种方法在遍历数组的过程中跳过元素为null、undefined和不存在的元素,我们可以这样做:

     var arr06=[1,2,3,null,4,undefined,5,,];
        for(var i=0;i<arr06.length;i++){
            if(!arr06[i])continue;
            console.log(i+"----"+arr06[i]);
        }

当然还有遍历除存在的元素

     var arr06=[1,2,3,null,4,undefined,5,,];
        for(var i=0;i<arr06.length;i++){
            if(!(i in arr06))continue;
            console.log(i+"----"+arr06[i]);
        }

如果想跳过元素为undefined和不存在的元素,可以这么做:

     var arr06=[1,2,3,null,4,undefined,5,,];
     for(var i=0;i<arr06.length;i++){
            if(arr06[i]===undefined)continue;
            console.log(i+"----"+arr06[i]);
        }

然后就是利用for  in进行遍历。例:

     var arr06=[1,2,3];
        for(var index in arr06){
            console.log(index+"----"+arr06[index]);
        }

但是利用for in会有一个问题那就当我们自定义一些原型属性时,这些属性也是被遍历出来的。例:

     var arr06=[1,2,3];
        Array.prototype.test=5;
        for(var index in arr06){
            console.log(index+"----"+arr06[index]);
        }

当然数组内置的一些原型属性,例如join,map等等都是不可遍历的。所以一般不推荐使用这种方法,因为你可能不知道代码中别人是否在原型上面增加了方法或者属性,而导致最后for in遍历时多出了很多意料之外的结果。当然你可以采用下面的办法,把这些意料之外的结果剔除。

    for(var index in arr06){
            if(!arr06.hasOwnProperty(index))continue;
            console.log(index+"----"+arr06[index]);
        }

还有一种方法就是利用ES5新增方法-forEach()至于该方法的介绍大家可以参见我的这篇博文

4 数组基本方法

join():将数组中所有的元素都转换成字符串拼接在一起,最后返回这个字符串。它接受一个参数,表示每个元素之间的分隔符,当然该参数是可选的。Array.join是String.split的逆向操作。这一组操作是非常有用的,还望大家能够理解运用。见例程:

     var arr06=[1,2,3];
        var str="1-2-3";
        console.log(arr06.join("-"));  //1-2-3  已经转换为字符串
        console.log(str.split("-"));   //["1", "2", "3"]  已经转换为数组

reverse():就是将数组的元素顺序实现反转,比如原来是[1,2,3]实行该操作后就会变成[3,2,1]。这里我就不再举例了,想偷点懒了,写的太累了,也不想太啰嗦了。

sort():该函数是为数组元素实现排序的一个函数,如果不传参数的话,会将数组元素按照字符串进行排序,这里我们应该都知道,字符串比较大小,实际上是比较他们的ASCII值的大小,在ASCII码中“a”的ASCII码是97而“A”的ASCII码是65,97大于65,所以字符串的比较结果应该是“a”大于“A”。在sort函数中就是逐个比较两个元素中对应位置字符的ASCII的大小。例如:“abcd”和“abce”,前面三个字符“abc”都是一样的,实际上最后比较的是“d”和“e”的ASCII码值。

var arr07=["j","d","l"]
console.log(arr07.sort());//["d", "j", "l"]

当然如果数组元素是数字,那么sort函数会把数字转换成字符串进行比较,而不会进行真正的数值比价,见例程:

var arr07=[3,15,4]
console.log(arr07.sort());//[15, 3, 4]  应为“1”的ASCII码值小于“3”

如果要做到真正数值上的排序,这要给sort传入一个参数,这个参数就是一个比较函数。例:

     var arr07=[3,15,4]
        console.log(arr07.sort(function(a,b){
            return a-b;
        }));   //[3, 4, 15]

比较规则就是,假设第一个参数应该在前,比较函数应该返回一个小于0的值,在后返回一个大于0的值,如果两个数大小一样,谁在前面显得不是很重要就返回0。如果要是从大到小排,我们只需要改成 return b-a;

concat():数组拼接。直接上例程自行体会

     var arr08=[0,1,2];
        var arr09=[3,4];
        var arr10=[5,6];
        console.log(arr08.concat(arr09));//[0, 1, 2, 3, 4]
        console.log(arr08.concat(arr09,arr10));//[0, 1, 2, 3, 4, 5, 6]
        console.log(arr08.concat(arr09,arr10,[7,8,[9,10]]));//[0, 1, 2, 3, 4, 5, 6, 7, 8, [9,10]]

slice():返回指定数组的一个片段或者子数组。例程如下

     var arr11=[0,1,2,3,4,5,6];//
        console.log(arr11.slice(0,3));//[0, 1, 2] 
        console.log(arr11.slice(3,1));//[]  这样获取的会是空数组
        console.log(arr11.slice(3));//[3, 4, 5, 6]  没有指定第二个参数,表示截取从第三个元素一直到最后的所有数组元素
        console.log(arr11.slice(0,-1));//[0, 1, 2, 3, 4, 5]  负数代表倒数第几个  
        console.log(arr11.slice(-5,-3));//[2, 3]  截取从倒数第五个到倒数第3个之间的元素
        console.log(arr11.slice(-3,-5));//[]  空数组

splice():该方法是在数组中插入和删除元素的通用方法。它的第一个参数指定了插入或者删除的起始位置,第二个参数表示删除的个数,如果没有指定,则表示从删除从指定位置到数组结尾的所有元素,并最后返回这个删除的元素数组。如果没有删除元素则返回一个空数组。

     var arr12=[1,2,3,4,5,6,7,8];
        console.log(arr12.splice(4)+"--原数组:"+arr12);
        console.log(arr12.splice(1,2)+"--原数组:"+arr12);
        console.log(arr12.splice(1,1)+"--原数组:"+arr12);
        console.log(arr12.splice(1,0)+"--原数组:"+arr12);

splice()前两个参数指定了删除的起始位置和删除元素的个数,其后面任意个参数表示要插入的元素。例:

     arr12.splice(1,0,"djl");//[1, "djl", 2, 3, 4, 5, 6, 7, 8]
        arr12.splice(1,1,"djl");//[1, "djl", 3, 4, 5, 6, 7, 8]

 push()和pop():

push()向数组末尾追加元素,pop():删除数组最后一个元素。都是会直接改变原数组的长度。不再举例了,累。

shift()和unshift()

shift():删除数组的第一个元素;unshift():在数组最前面添加一个元素。也都是会直接改变原数组的长度。

toString():将每个数组元素转化为字符串并且用逗号将每个元素进行分隔,这里和不传入参数的join方法所达到的效果是一样的。

目前就这么多了,已经够多了,能够耐心看到这里的,必须好好犒劳一下自己!

推荐阅读