1.数组的基本操作
前言:ECMAScript数组是很常用的一种数据类型,在其他的语言中,数组也是很常用很重要的一种数据类型.但ECMAScript数组有些地方还是有自己的特点的,如下:
1)数组的每一项可以保存任何数据类型的数据,也就是数组中的数据可以有多种数据类型.
2)数组的大小是可以动态调整的,可以随着数据的添加自动增长以容纳新增数据.
下面进入正题,来说说数组的基本操作
首先要操作数组,那么就要先创建数组
数组的创建
使用构造函数Array创建数组
var arr1=new Array(); //无参创建
var arr2=new Array(20);//指定数组大小
var arr3=new Array("red","green","blue");//指定数组中的数值
使用数组字面量表示法创建数组
var arr4=[];
var arr5=["red","green","blue"];
//和对象一样,在使用数组字面量表示法时,也不会调用Array构造函数(Firefox3以及更早版本除外)
注:数组的属性length很特殊,可读可写,arr[arr.length]=”newvalue”;可用来在数组末尾添加新项
数组的检测方法
第一种,instanceof操作符,与全局环境有关
if(arr1 instanceof Array)
{
alert("是数组!");
}
第二种,Array.isArray()方法,支持的浏览器有IE9+,Firefox 4+,Safrai 5+,Opera 10.5+和Chorme,与全局环境无关.
if(Array.isArray(arr1))
{
alert("是数组!");
}
对于尚未实现这个方法的浏览器中检测数组如下方法:
function isArray(value) {
return Object.prototype.toString.call(value)=="[object Array]";
}
数组的转换方法
- toLocaleString()方法
- toString()方法 ,返回的是以逗号分割的字符串
- valueOf()方法 ,返回的是数组
- jon(“separator”),用separator构造包含所有数组的字符串
数组的栈方法
栈(后进先出)是一种可以限制插入和删除项的数据结构,其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
- push()方法,可接收任意数量的参数,把它们逐个添加到数组末尾,并返回修改后的数组长度.
- pop()方法,从数组的末尾移除最后一项,减少数组length的值,然后返回移除的项.
arr3=arr3.push("yellow","yellow");//进栈
var item=arr3.pop();//出栈
数组的队列方法
队列(先进先出)是一种特殊的线性表,特殊之处在于它只允许在表的前端进行删除操作,而在表的后端进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。
- shift()方法,移除数组中的第一项并返回该项,同时数组的长度减一(和push()配合使用可实现队列)
- unshift()方法,在数组前端添加任意个项,并返回新数组的长度(和pop()配合使用可实现反队列)
数组的排序和重排序
- 重排序 reverse()方法,会改变原数组
排序 sort()方法
默认情况下,sort()方法按升序排列数组项,sort()方法会调用每个数组项的toString()转型方法,然后比较得到的字符串,以确定排列顺序.所以即使数组中的每一项是数值,sort()方法比较的也是字符串,所以数字排序需要稍微做一点改动.
数字正序排序
function sort(a,b) {
return a-b;//正序排序
}
数字反排序
function sort(a,b) {
return b-a;//反排序
}
注意:reverse()和sort()方法的返回值是经过排序之后的数组
数组的排序也可以不用默认的排序方法,可以使用常规的冒泡排序,选择排序以及插入排序和快速排序,js常用排序算法见本人博客地址:http://blog.csdn.net/codezha/article/details/72960251.
数组的常用操作方法
concat()方法,该方法会创建当前数组的副本,然后将接收到的参数添加到副本的末尾,最后返回新创建的数组.
1)无参调用的情况下,只复制当前数组并返回副本
2)如果传递的是一个或多个数组,该方法会将这些数组中的每一项添加到结果数组中.
3)如果传递的不是数组,这些值就被简单的添加到结果数组的末尾.slice()方法,该方法能够基于当前数组的一个或多个项创建一个新数组,可接收一个或两个参数不会影响原数组.
1)在只有一个参数的情况下,slice()方法返回从该参数指定位置开始到当前数组末尾的所有项.
2)在有两个参数的情况下,slice()方法返回从起始位置到结束位置之间的项,但不包括结束位置的项.
注意:如果slice()方法的参数中有一个负数,则用数组长度加上该数来确定相应的位置,如果结束位置小于起始位置,则返回空数组.
splice()方法,该方法的主要用途是向数组的中部插入项
1)删除
可以删除任意数量的项,只需要指定两个参数:要删除的第一项的位置和要删除的项数.
例如:splice(0,3)会删除数组中的前两项.
2)插入
可以向指定位置插入任意数量的值,只需要指定三个参数:起始位置,要删除的项数和要插入的项数.
例如:
splice(0,2,”red”,”green”);
从数组的位置2开始插入字符串”red”和”green”3)替换
可以向指定位置插入任意数量的项,且同时删除任意数量的项,插入的项数不必与删除的项数相等,只需指定三个参数:起始位置,要删除的项数和要插入的任意数量的项.
例如:
splice(2,1,”red”,”green”);
删除当前数组位置2的项,然后从位置2开始插入字符串”red”和”green”
注:
splice()方法始终都会返回一个数组,该数组中包含从原始数组中删除的项(如果没有删除任何项,则返回一个空数组)
位置方法
都接收两个参数:要查找的项和表示查找起点位置的索引
- indexOf() 从数组的开头向后查找
- lastIndexOf() 从数组的末尾向前查找
迭代方法
- every():对数组中的每一项运行给定函数,如果该函数对每一项都返回true,则返回true.
- filter():对数组中的每一项运行给定函数,返回该函数会返回true的项组成的数组.
- forEach():对数组中的每一项运行给定函数,这个方法没有返回值.
- map():对数组中的每一项运行给定函数,返回每次函数调用的结果组成的数组.
- some():对数组中的每一项运行给定函数,如果该函数对任一项都返回true,则返回true.
归并方法
接收两个参数:一个在每一项上调用的函数和(可选的)作为归并基础的初始值
- reduce() 第一项开始,遍历到最后一项
reduceRight() 最后一项开始,遍历到第一下项
注:支持的浏览器有IE9+,Firefox3+,Safaris,OPera 10.5和Chrome