第七章 数组
一、创建数组
使用数组直接量是最简单的方法:
var empty=[]; var primes=[1,3,5,7,11]; var m=[1.1,"a",true]; var b=1024; var table=[b,b+1,b+2]; var bc=[[1,{x:1,y:2}],[2,{x:3}]] //如果直接量中省略某个值,则默认赋予undefined值 var count=[1,,3];
数组直接量中允许元素结尾有逗号:
var a=[1,2,]; //两个元素分别为1和2 var b=[true,,]; //两个元素分别为true和undefined
另外一种方法是调用构造函数Array():
var arra=new Array(); //无参数 var arrb=new Array(10); //创建一个长度为10的数组 var a=new Array(5,3,1,"testabc"); //显式指定元素
二、数组元素的读写
var a=["world"]; var value=a[0]; //读第0个元素 a[1]=3.14; //写第1个元素 i=2; a[i]=3; //写第2个元素 a[i+1]="hello"; //写第3个元素 a[a[i]]=a[0]; //读第0个和第2个元素,写第3个元素
数组是对象的特殊形式,使用方括号访问数组元素就像用方括号访问对象的属性一样——即JavaScript把数组的数字索引转换成字符串:即索引值0变为“0”,索引值1变为“1”,然后将其作为属性名使用。这一点对于常规对象也可以这样做:
var o={}; //创建一个普通对象 o[1]="one";
虽然如上所述,但对于数组来说,其特别之处在于可以自动维护length属性值(当长度小于2^32)。所有的索引都是属性名,但只有0~(2^32-2)之间的整数的属性名才可以作为索引。所有数组都是对象
三、稀疏数组
稀疏数组就是包含从0开始的不连续索引的数组,因此稀疏数组的length属性值是大于元素实际的个数的。
a=new Array(5); //数组没有元素,但是长度为5 a=[]; //创建一个空数组,length=0 a[1000]=0; //给数组a 添加元素,此时length=1001
四、数组长度
当设置数组length属性值为一个小于当前长度的整数值时,数组则会相应变化。
a=[1,2,3,4,5]; a.length=3; //此时a变成[1,2,3] a.length=0; //此时a变成[] a.length=5; //此时a长度为5,但没有元素,类似于new Array(5)
如果将length属性值设为大于当前长度的整数值,这并不会向数组中添加元素,而只是在原数组尾部创建一个空的区域。
五、数组元素的添加和删除
直接为新索引赋值:
a=[]; a[0]="zero"; a[1]="one";
也可以用push()方法在尾部增加一个或多个元素,这种方法在操作增加一个元素时和给数组a[a.length]赋值是一个效果:
a=[]; a.push("zero"); a.push("one","two"); //此时a为["zero","one","two"]
如果要在数组首部插入一个元素,可以使用unshift()方法,其他元素依次移动到更高索引位置上。
a=[1,2,3]; delete a[1]; //此时索引1处没有元素,a变成稀疏数组 1 in a; //false a.length //依旧为3,长度不变。
另外可以把length设置小以删除尾部的元素。数组也有pop()方法,每次使用减少长度1并返回被删除的元素值。还有一个shift()方法,从头部删除一个元素。
六、数组遍历
使用for循环是遍历数组最常见的方法:
var keys=Object.keys(o); //获得o对象属性名组成的数组 var values=[]; for(var i=0; i<keys.length;i++) { var key=keys[i]; values[i]=o[key]; }
七、多维数组
var table=new Array(10); for(var i=0;i<table.length;i++) table[i]=new Array(10); for(var row=0;row<table.length;row++) { for(col=0;col<table[row].length;col++) { table[row][col]=row*col; } }
八、数组方法
1、join()将数组中所有元素都转换成字符串并链接在一起,返回最后生成的字符串。默认使用逗号进行分隔,也可以指定参数作为分隔符。
var a=[1,2,3]; a.join(); //"1,2,3" a.join(" "); //"1 2 3" a.join(""); //"123" var b=new Array(10); b.join("-"); //"---------";9个连字号
2、reverse()方法将数组中的元素倒序,返回逆序后的数组,替换原数组。
var a=[1,2,3]; a.reverse().join(); //"3,2,1",a也变成了[3,2,1]
3、sort()方法将数组元素依据一定规则进行排序,当没有参数时,元素用字母表顺序排序。数组中的undefined元素,会被排到数组尾部。
var a=new Array("banana","cherry","apple"); a.sort(); var s=a.join(", "); //“apple, banana, cherry”
4、slice()方法返回指定数组的一个片段或子数组。
var a=[1,2,3,4,5]; a.slice(0,3); //返回[1,2,3] a.slice(3); //返回[4,5] a.slice(1,-1); //返回[2,3,4] a.slice(-3,-2); //返回[3]
5、splice()方法能从数组中删除元素、插入元素到数组中或同时两个操作。第一个参数指定了插入或删除的起始位置,第二个参数指定了应该从数组中删除的元素的个数,如果第二个参数省略,则从起始点到数组结尾所有元素都将被删除。splice()返回一个由删除元素组成的数组,如果没有删除元素就返回空数组。
var a=[1,2,3,4,5,6,7,8]; a.splice(4); //返回[5,6,7,8],a变成[1,2,3,4] a.splice(1,2); //返回[2,3],a变成[1,4] a.splice(1,1); //返回[4],a变成[1]
splice()前两个参数指定了需要删除的数组元素,紧随其后面的任意个参数指定了需要插入到数组中的元素,插入的位置由第一个参数指定。
var a=[1,2,3,4,5]; a.splice(2,0,‘a‘,‘b‘]; //返回[];a变成[1,2,‘a‘,‘b‘,3,4,5] a.splice(2,2,[1,2],3); //返回[‘a‘,‘b‘];a变成[1,2,[1,2],3,3,4,5]
6、push()/pop()方法:push()在数组尾部添加一个或多个元素,并返回数组新的长度。pop()则删除数组的最后一个元素,减少数组长度并返回被它删除的值。两个方法都修改并替换的原数组。