其实数组,字符串等等都是在刚开始学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方法所达到的效果是一样的。
目前就这么多了,已经够多了,能够耐心看到这里的,必须好好犒劳一下自己!
原文:http://www.cnblogs.com/djlxs/p/5414516.html