JavaScript 数组

数组特性详解

作者 Haojen Ma 日期 2015-10-24
JS
JavaScript 数组

数组是值的有序集合.每个值叫做一个元素, 而每个元素在数组中有一个位置,以数字表示,称为索引 数组特性:

1:JS中的数组是无类型的:这代表着数组元素可以是任意类型. 2:JS中的数组是动态的:可以根据需要增长或缩减,并且在创建的时候无需声明固定的大小,也无需在数组发生变化的时候重新分配空间 JS中数组元素的索引不一定要连续, 它们之间可以有空缺 每个数组都有一个 length属性,对于连续索引的数组来说,该属性就是数组元素的个数;而对于非连续索引的数组来说,length比所有元素的索引要大 hz: 注意,当使用数组length遍历非连续索引的数组的时候需要注意的 数组直接量的语法允许有可选的结尾的都好,故[,,]只有两个元素而非三个

<!-- more -->

创建数组

使用数组直接量创建:

var new array=[]; 调用构造函数Array()创建: var array = new Array(); //调用时没有参数的,效果等同于var new array=[] var array = new Array(10)//调用时指定参数,意味着该数组有指定的长度,但是数组中并没有存储任何值,索引属性(尚未定义) var array = new Array(5,4,3,2,1, "testing , testing”)//显式指定两个或多个数组元素或者数组的一个非数值元素,以这种形式,构造函数的参数将会成为新数组的元素. 但使用数组字面量比使用构造函数的数组要简单方便

数组中的值不一定要是常量;它们可以是任意的表达式; 例如: var base =1024; var table =[base,base+1,base+2]; 它还可以包含对象直接量或者其他数组的直接量: 例如: var b =[[1,(x:1,y:2)],[2,(x;3,y:4)]]; 如果省略数组直接量中的某个值,省略的元素将被赋予undefined值

数组元素的读和写

var a=['world'];//在索引0下建立一个数组元素;
var val = a[0];//将world装到val里
	a[1]=3.14 //在索引1上写入3.14这个number类的元素
var i=2;
	a[i]=3//在索引2上写入2这个number类的元素
	a[i+1]='hello'//在索引3上写入string类的hello元素
	a[a[i]]=a[0]//读取索引0和索引2的元素,并写入第三个元素 

数组是对象的特殊形式. 使用方括号访问数组元素,就像用方括号访问对象的属性一样..javascript将指定的数字索引值转换成字符串—索引值1变成"1"—然后将其作为属性名来使用. 需要注意的是:数组是对象的特殊形式, 以下是一个数组和创建一个对象的对比

	var obj ={};//创建一个普通的对象
	obj[1]="someValue" //将这个字符串给obj.1属性,
	var array =[];
	array[1]="someValue" //将这个字符串赋值给索引为数字1的数组

##数组元素的添加和删除 ###删除,添加,替换 splice() (翻译:连接,结合,粘接) 删除 <br/> 在数组中插入或删除元素的通用方法,方法的第一个参数指定了插入和删除的位置,第二个参数指定了应该从数组中删除的元素的个数.如果省略第二个参数,将从起始点开始到数组的结尾,这之间的元素都会被删除, 且会返回一个由被删除元素组成的数组,或者如果没有删除元素,就返回一个空数组

var a=[1,2,3,4]
a.splice(2);//2后面的元素都会被删除,且返回被删除的[3,4]
a.splice(1,2)//从1开始删除二个元素,返回[2,3],a 剩余的值是[1,4]
a.splice(1,1)//从1后面开始删除一个元素,返回[2];剩余的a是[1,3,4]<br/>

splice() 添加 <br/> 该方法的前两个参数指定了需要删除的数组元素,紧随其后的任意个数的参数指定了需要插入到数组中的元素

    var a=[1,2,3,4,5];
    a.splice(2,0,'a','b')//返回[],原因是删除的内容为0,并插	入'a','b'到[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]

<br/>splice() 替换 <br/>

var a=[1,2,3,4,5];
	a.splice(2,3,'a','b','c')//返回[3,4,5],且替换他们为1,2a,b,c

###添加 ####尾部添加 使用 push() 方法在数组的末尾增加一个或多个元素,并有一个返回值:返回数组在添加新的元素后的长度 a =[]; a.push("zero")//在末尾添加一个元素 a.push('one','two') //再添加两个元素 a此时的值为["zero","one","two"] ####首部添加 使用unshift()方法, 在数组的首部插入一个元素, 且同push()具有一个相同的返回值:返回最新的数组长度,并且将其他元素的索引依次移到更高的索引位. NOTEIE6/7 不支持该方法的返回值 ###删除 NOTE 注意,push()和pop()都修改并替换原始数组,而非生成一个修改后的新数组. ####尾部删除 pop() 它删除数组中最后一个元素,并减小数组长度且返回它删除的值 var a=[1,2,3,4,5]; alert(a.pop())//返回5 ####头部删除 shift() shift()删除数组的第一个元素并将其返回,然后把所有随后的元素下移一个位置,来填补数组头部的空缺. var a=[1,2,3,4,5]; alert(a.shift())//返回1 ####其他 使用delete运算符删除数组元素 a=[1,2,3] delete a[1]; 删除a[1]后,数组的长度仍然不变,删除数组元素与其赋undefined值是类似的

设置数组length属性,来清空数组或者减小数组 a=[1,2,3,4,5] a.length =0 //清空数组 a.length =3 //长度为三,删除后两位

为数组重新赋值(效率相对较高) a=[1,2,3,4,5] a=[]//重新赋值,达到清空的目的 ##数组遍历 ###for循环 排除null和undefined的稠密数组元素,可以利用如下代码:

for(var i=0;i<array.length;i++){
	if(!array[i]){
	  //如果数组不为false则执行里面的代码
	}	
}

###for in循环 for in 循环适合处理稀疏数组, 每次循环将一个可枚举的属性名(包括数组索引)赋值给循环变量,且不存在的索引将不会遍历到 for/in 循环可以以不同的顺序遍历对象的属性 ###forEach() 从头至尾遍历数组, 为每个元素调用指定的函数 ##多维数组 “JavaScript不支持真正的多维数组,但可以用数组的数组来近似”

数组方法

###join() 将数组中所有元素都转化为字符串并连接在一起,且可以指定一个可选的字符串在生成的字符串中来分隔数组的各个元素,如果不指定,默认使用逗号 “该方法是String.split()方法的逆向操作,后者是将字符串分割成若干块来创建一个数组。”

reverse()

将数组中的元素颠倒顺序,返回逆序的数组

var a =\[1,2,3]
a.reverse()// a=\[3,2,1]

sort() 排序

将数组中的元素排序并返回排序后的数组, 当不带参数调用该函数时, 数组元素默认以字母表(字符串uncode编码值)顺序排序,且如果数组中包含 undefined元素,他们会被排到数组的尾部

var a=new Array("banana","cherry","apple");
a.sort() //结果是:apple,banana,cherry
var a =[1,2,3,8,7666,,9]
a.sort() //结果是[1,2,3,7666,8,9]

sort 也可以接受一个比较函数作为参数, 以便我们自行定制排序的方法

var a=[1,5445,3434,6565,23]
	a.sort(function(a,b){
		return a-b //如果第一个参数应该在第二个之前,则返回一个负数,如果两个数相等,则返回0,如果第一个参数应该位于第二个之后则返回一个正数
		降序的办法:
		return b-a //第一个值应该位于第二个之后,则返回一个正数,如果第一个参数应该位于第二个之前则返回一个负数.
	})

concat() 合并数组

先创建当前数组的一个副本,然后将接受到的参数天极道这个副本的末尾,最后返回新构建的数组.在没有给caocat()方法传递参数的情况下, 它只是赋值当前数组并返回副本,如果传递给该方法了一个或多个数组,则它会将这些数组的每一项元素都添加到数组中. 如果传递的值不是数组,那么这些值就会被简单的添加到结果数组的末尾

a=[1,2,3,4]
a2=a.concat(['2',123])//a2的结果是:12342123

slice()

返回指定数组的一个片段或者子数组 ###toString() 和 toLocalString() 数组和其他JS对象一样,拥有toString()方法, 该方法针对数组,将其每个元素转化为字符串,并且输出用逗号分隔的字符列表. toLocaleString()是toString()方法的本地化版本. 该方法将每个元素转化为字符串,并使用本地化(和自定义实现的)分隔符将这些字符串链接起来,生成最终的字符串

map()

调用数组的每个元素传递给指定的函数,并返回一个数组, 它包含该函数的返回值

a=[1,2,3,4]
b=a.map(function(x){
	return x*x; //b的结果是[1,4,9,16]
})

filter()

如果对某一稀疏数组调用该函数

every 和 some()

这两种方法是数组中的逻辑判定:every()对数组元素应用指定的函数,进行布尔值判断 当某一数组中所有元素都返回true时,它才会返回true; some():当数组中至少有一个元素调用判定函数返回true, 则它就会返回true;并且当且仅当数值中的所有元素调用判定函数都返回falsely,它才返回false; 注意:该两种函数在确认返回值的时候就会立马停止遍历数组元素,every在空数组上调用时,它返回true,some()返回false

reduce()和reduceRight()

indexOf和lastIndexOf()

这两个方法搜索整个数组中具有给定的元素,返回找到的第一个元素的索引或者如果没有找到就返回-1. indexOf会从头至尾的搜索, lastIndex则从反向搜索

第一个参数是需要搜索的值,第二个参数是可选的:他指定数组中的一个索引,从那里开始搜索,如果省略该参数,indexOf则从头开始搜索, 而lastIndex()则从末尾开始搜索,且可以是负数 注意:字符串中也有这两个方法, 功能类似; ##数组类型 数组是具有特殊行为的对象, 判断某个对象是不是数组的方法,可以利用a.isArray()函数来做这件事情: Array.isArray([])//true Array.isArray({})//false ##类数组对象 JS数组相对于其他对象所没有的特性:

  1. 当有新的元素添加到列表中是,自动更新length属性
  2. 设置length为一个较小的值将拦截数组
  3. 能从Array.prototype中继承一些有用的方法
  4. 其类属性为Array

##作为数组的字符串 var s =test; s.charAt(0)//"t" s.charAt[2]//"s" ##数组length的特征 数组length的长度既可以读也可写,这与string对象有很大的不同, string的length长度只可读