[关闭]
@panhonhang 2018-05-26T14:36:14.000000Z 字数 3539 阅读 538

引用类型之Array类型


数组是数据的有序列表。

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);
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注