@panhonhang
2018-05-26T14:36:14.000000Z
字数 3539
阅读 552
数组是数据的有序列表。
JS中的数组每一项都能保存任何类型的数据。
JS数组的大小是可以动态调整的,即可以随着数据的添加自动增长以容纳新增的数据。
创建数组的方式
第一种方式,使用Array构造函数。
var colors = new Array(); //创建一个空数组
var colors = new Array(3); //指定数组包含3项
var colors = new Array("red","green","blue"); //创建一个包含3项的数组
第二种方式,使用数组字面量表示法。
var colors = []; //创建一个空数组
var colors = ["red","green","blue"]; //创建一个包含3项的数组
多个数组项之间用逗号隔开,最后一项后面不要添加逗号。
通过数组字面量表示法定义数组时,不会调用Array构造函数。
length属性
数组的length属性不是只读的,通过设定length属性的值,可以移除某些项或者添加新项(新项的值为undefined)。
colors[colors.length] = "black"; //在数组末尾添加新项
colors[9] = "white";
colors.length //10 5-8项都是undefined
检测数组
Array.isArray()方法
alert(Array.isArray(array)); //true
转换方法
数组的toString()方法,返回的是一个字符串;数组中的每一项的字符串表示拼接起来,中间以逗号分割;
数组的valueOf()方法,返回的是一个数组;
alert()接收字符串参数,实际上会在后台调用数组的每一项的toString()方法,所以返回的值与调用toString()方法返回的值一样。
一般而言,toLocaleString()方法返回的值与toString()方法与valueOf()方法返回的值相同,但不总是这样,当显式地定义toLocaleString()方法和toString()方法,并设置不同的返回值时,这两个方法返回的值当然是不一样的。
例子:
var x = {
toString: function() {
return "black";
},
toLocaleString: function() {
return "black";
}
};
var y = {
toString: function() {
return "white";
},
toLocaleString: function() {
return "#fff";
}
};
var z = [x,y];
alert(z.toString()); //black,white
alert(z.toLocaleString()); //black,#fff
默认情况下,toLocaleString()方法、toString()方法、valueOf()方法返回的字符串以逗号分隔;可以用join()方法自定义分隔符;
join()方法接收一个参数,即用作分隔符的字符串,并返回一个包含所有数组项的字符串。
如果数组中某一项的值是null或者undefined,那么该值在toLocaleString()方法、toString()方法、valueOf()方法、join()方法返回的结果中以空字符串表示。
栈方法
栈是一种LIFO(Last-In-First-out,后进先出)的数据结构,也就是最新添加的项最早被移除。
栈中项的添加(推入)和移除(弹出),只发生在栈的顶部。
JS为数组提供了push()和pop()方法,实现类似栈的行为。
push()方法可以接收任意数量的参数,并把它们逐个添加到数组末尾,并返回修改后的数组的长度。
pop()方法从数组末尾移除最后一项,减少数组的length值,并返回移除的项。
队列方法
队列数据结构的规则是FIFO(First-In-First-Out,先进先出),队列在数组的末端添加项,在数组的前端移除项。
shift()方法,移除数组的第一项,减少数组的length值,并返回移除的项。
unshift()方法,在数组前端添加任意个项,并返回修改后的数组的长度。
重排序方法
reverse()方法,反转数组项的顺序。
sort()方法
在默认情况下,sort()方法按照升序排列数组项;sort()方法会调用数组的toString()方法,然后比较得到的字符串。
sort()方法可以接收一个比较函数作为参数。
比较函数接收两个参数:如果第一个参数应该位于第二个参数之前则返回一个负数;如果第一个参数应该位于第二个参数之后则返回一个正数;如果两个参数相等则返回0。
例子:比较函数,升序排列:
var compare = function(value1,value2) {
if (value1<value2) {
return -1;
} else if (value1>value2) {
return 1;
} else {
return 0;
}
};
var y = [1,3,2,4,5];
alert(y.sort(compare)); //1,2,3,4,5
alert(y.sort(compare).reverse()); //5,4,3,2,1
对于数值类型或者其valueOf()方法会返回数值类型的对象类型,可以使用一个更简单的比较函数。
升序:
function compare(value1,value2) {
return value1-value2;
};
操作方法
concat()方法,创建当前数组中所有项的一个副本,然后将接收到的参数添加到这个副本的末尾,最后返回新建的数组。 //不影响原始数组,最后返回的是一个新数组。
slice()方法,基于当前数组中的一个或多个项创建一个新的数组;接收两个参数,起始位置(包含在内)和结束位置(不包含在内)。 //不影响原始数组。
如果slice()方法的参数中有负数,则用数组的长度加上负数以确定相应的起始和结束位置;如果结束位置小于起始位置,则返回一个空数组。
splice()方法 //改变原始数组
删除:可以删除任意数量的项;接收两个参数,起始位置、删除的项数; //返回删除的项。
插入:可以插入任何数量的项;接收三个参数,起始位置、0(删除的项数)、插入的项; //返回空数组。
替换:可以替换任意数量的项;接收三个参数,起始位置、删除的项数、插入的项;删除的项与插入的项不必相等。 //返回删除的项。
位置方法
indexOf()方法,从数组的开始位置向后查找;
lastIndexOf()方法,从数组的末尾向前查找;
接收两个参数,查找的项、(可选)查找起点位置的索引;返回查找的项在数组中的位置。
例子:
var x = [1,2,3,4,5,4,3,2,1];
alert(x.indexOf(4)); //从前往后找,第一个“4”,下标为3,返回 3 ;
alert(x.lastIndexOf(4)); //从后往前找,第一个“4”,下标为5,返回 5 ;
alert(x.indexOf(4,4)); //从下标为"4"的项开始往后找,返回5;
alert(x.lastIndexOf(4,4)); //从下标为"4"的项开始往前找,返回3;
迭代方法
every()方法,对数组中的每一项都运行给定函数,如果该数组中的每一项都返回true,则返回true;
some()方法,对数组中的每一项都运行给定函数,如果该数组中有任何一项返回true,则返回true;
filter()方法,对数组中的每一项都运行给定函数,返回该数组中返回true的项;
map()方法,对数组中的每一项都运行给定函数,返回每一项运行函数后的结果;
forEach()方法,对数组中的每一项都运行给定函数,没有返回值。
这些方法接收两个参数:给定的函数、(可选)运行该函数的作用域对象——影响this的值。
其中函数接收三个参数:数组项的值,数组项的索引,数组对象本身。
例子:
var x = [1,2,3,4,5,4,3,2,1];
var y = x.filter(function(item,index,array){
return (item>3);
});
alert(y); //4,5,4
归并方法
reduce()方法;
reduceRight()方法;
迭代数组中的所有项,然后构建一个最终返回的值。
这两个方法都接收两个参数:在每一项上都调用的函数、(可选)作为归并基础的初始值。
其中函数接收四个参数:前一个值、当前的值、项的索引、数组对象本身。
这个函数返回的任何值都会作为第一个参数传给下一项。
例子:
var x = [1,2,3,4,5];
var y = x.reduce(function(pre,cur,index,array){
return (pre*cur);
});
alert(y);