再读斋

JavaScript⑥引用类型Array

JavaScript的Array可以包含任意数据类型,并通过索引来访问每个元素。

创建数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//创建空数组
var arr1 = new Array();
//创建长度为10的数组
var arr2 = new Array(10);
var arr3 = new Array("red","blue","green");
var colors = ["red","blue","green"];
console.log(colors.length);
//改变数组长度,用undefined元素补全
colors.length = 4;
console.log(colors);
//索引超出范围同样会改变数组长度,未复制的元素用undefined补全
colors[5] = 45;
console.log(colors);
//[ 'red', 'blue', 'green', , , 45 ]

检测数组

1
2
3
4
5
6
7
8
9
//判断是否是数组
if (colors instanceof Array) {
console.log("是数组");
}
//ECMAScript5新增方法
if (Array.isArray(colors)) {
console.log("是数组");
}

instanceof 操作符的问题在于,它假定只有一个全局执行环境。如果网页中包含多个框架,那实 际上就存在两个以上不同的全局执行环境,从而存在两个以上不同版本的 Array 构造函数。

ECMAScript 5 新增了 Array.isArray()方法。这个方法的目的是最终确定某 个值到底是不是数组,而不管它是在哪个全局执行环境中创建的。

转换方法

1
2
3
4
5
6
7
8
9
10
11
12
13
colors = ["red","blue","green"];
//返回以逗号分隔元素值的字符串
console.log(colors.toString());
//red,blue,green,45
//返回以指定字符串分隔元素值的字符串
console.log(colors.join("|"));
//red|blue|green
//返回数组
console.log(colors.valueOf());
//[ 'red', 'blue', 'green', 45 ]

添加删除元素

push 和 pop

  • push():接收任意数量的参数,把它们逐个添加到数组末尾,并返回修改后数组的长度。
  • pop():pop()方法则从数组末尾移除最后一项,减少数组的 length 值,然后返回移除的项。
1
2
3
4
5
6
7
8
9
//数组末尾增加元素
colors.push("gray");
colors.push("white");
colors.push("dark");
console.log(colors);
//删除最后一个元素,同时返回这个元素
console.log(colors.pop());

shift 和 unshift

  • shift():能够移 除数组中的第一个项并返回该项,同时将数组长度减 1。
  • unshift():它能在数组前端添加任意个项并返回新数组的长度。
1
2
3
4
5
6
7
//删除并返回第一个元素
console.log(colors.shift());
//在数组首位添加元素并返回新数组的长度
console.log(colors.unshift("red","orange"));
console.log(colors);
//[ 'red', 'orange', 'blue', 'green', 'gray', 'white' ]

排序方法

reverse

reverse()方法会反转数组项的顺序。

1
2
3
4
5
//反转数组元素
var values = [1,2,3,4,5,0];
values.reverse();
console.log(values);
//[ 0, 5, 4, 3, 2, 1 ]

sort

在默认情况下,sort()方法按升序排列数组项——即最小的值位于最前面,最大的值排在最后面。 为了实现排序,sort()方法会调用每个数组项的 toString()转型方法,然后比较得到的字符串,以 确定如何排序。即使数组中的每一项都是数值,sort()方法比较的也是字符串,

1
2
3
4
5
values = [0, 1, 5, 10, 15];
//数组排序
values.sort();
console.log(values);
//[ 0, 1, 10, 15, 5 ]

因为数值 5 虽然小于 10,但在进行字符串比较时,”10”则位于”5”的前面,于是数组的顺序就被修改了。

sort()方法可以接收一个比较函数作为参数,以便我们指定哪个值位于哪个值的前面。比较函数接收两个参数,如果第一个参数应该位于第二个之前则返回一个负数,如果两个参数相等 则返回 0,如果第一个参数应该位于第二个之后则返回一个正数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function compare(v1,v2) {
if (v1 < v2) {
return -1;
} else if (v1 > v2) {
return 1;
} else {
return 0;
}
}
//数组排序
values.sort(compare);
console.log(values);
//[ 0, 1, 5, 10, 15 ]

操作方法

splice

splice()方法始终都会返回一个数组,该数组中包含从原始数组中删除的项(如果没有删除任何项,则返回一个空数组)。

splice()的主要用途是向数组的中部插入项,但使用这种方法的方式则有如下 3 种。

  • 删除元素:可以删除任意数量的项,只需指定 2 个参数:要删除的第一项的位置和要删除的项数。 例如,splice(0,2)会删除数组中的前两项。
  • 插入元素:可以向指定位置插入任意数量的项,只需提供 3 个参数:起始位置、0(要删除的项数)和要插入的项(可以是多项)。
  • 替换元素:可以向指定位置插入任意数量的项,且同时删除任意数量的项,只需指定 3 个参数:起 始位置、要删除的项数和要插入的任意数量的项。插入的项数不必与删除的项数相等。
1
2
3
4
5
6
7
8
9
10
11
12
var company = ['Microsoft', 'Apple', 'Yahoo', 'AOL', 'Excite', 'Oracle'];
//删除指定位置0开始的2个元素
company.splice(0,2);
console.log(company);
//删除并添加元素
company.splice(0,1,"facebook");
console.log(company);
//指定位置2添加元素
company.splice(2,0,"Google","Airbnb");
console.log(company);

slice

slice()方法可以 接受一或两个参数,即要返回项的起始和结束位置。在只有一个参数的情况下,slice()方法返回从该 参数指定位置开始到当前数组末尾的所有项。如果有两个参数,该方法返回起始和结束位置之间的项— —但不包括结束位置的项。注意,slice()方法不会影响原始数组。

1
2
3
4
5
6
7
8
//截取Array的部分元素
var a = company.slice(0,3);
console.log(a);
//复制Array
a = company.slice();
console.log(a);
console.log(a == arr); //false

concat

concat()方法可以基于当前数 组中的所有项创建一个新数组。具体来说,这个方法会先创建当前数组一个副本,然后将接收到的参数 添加到这个副本的末尾,最后返回新构建的数组。在没有给 concat()方法传递参数的情况下,它只是 复制当前数组并返回副本。

1
2
3
4
5
6
//合并两个Array,并返回一个新的Array
var l1 = [1,2,3];
var l2 = [4,5,6];
var l = l1.concat(l2);
console.log(l);
console.log(l == l1); //false

位置方法

indexOf

1
2
3
4
5
var arr = [10, 20, '30', 'xyz',10];
//返回指定元素的第一次出现位置
console.log(arr.indexOf(10));
//没有找到返回 -1
console.log(arr.indexOf(0));

lastIndexOf

1
2
//返回元素最后一次出现的位置
console.log(arr.lastIndexOf(10));

迭代方法

ECMAScript 5 为数组定义了 5 个迭代方法。每个方法都接收两个参数:要在每一项上运行的函数和(可选的)运行该函数的作用域对象——影响 this 的值。传入这些方法中的函数会接收三个参数:数 组项的值、该项在数组中的位置和数组对象本身。

  • every():对数组中的每一项运行给定函数,如果该函数对每一项都返回 true,则返回 true。
  • some():对数组中的每一项运行给定函数,如果该函数对任一项返回 true,则返回 true。
  • filter():对数组中的每一项运行给定函数,返回该函数会返回 true 的项组成的数组。
  • map():对数组中的每一项运行给定函数,返回每次函数调用的结果组成的数组。
  • forEach():对数组中的每一项运行给定函数。这个方法没有返回值。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
var numbers = [1,2,3,4,5,6,7,8,9,5,4,3,2,1];
//每一项都返回true,则结果为true
var everyResult = numbers.every(function (item,index,array) {
return item > 2;
});
console.log(everyResult);
//false
//有一项返回true,则结果为true
var someResult = numbers.some(function (item,index,array) {
return item > 2;
});
console.log(sommeResult);
//true
//筛选出指定条件的元素数组
var filterResult = numbers.filter(function (item,index,array) {
return item > 2;
})
console.log(filterResult);
//[ 3, 4, 5, 6, 7, 8, 9, 5, 4, 3 ]
//对数组每一项都运行给定的函数,返回计算后的元素数组
var mapResult = numbers.map(function (item, index, array) {
return item * 2;
});
console.log(mapResult);
//[ 2, 4, 6, 8, 10, 12, 14, 16, 18, 10, 8, 6, 4, 2 ]
//遍历数组
numbers.forEach(function (item,index,array) {
console.log(item);
});

归并方法

ECMAScript 5 还新增了两个归并数组的方法:reduce()和 reduceRight()。这两个方法都会迭 代数组的所有项,然后构建一个最终返回的值。这两个方法都接收两个参数:一个在每一项上调用的函数和(可选的)作为归并基础的初始值。

传给 reduce()和 reduceRight()的函数接收 4 个参数:前一个值、当前值、项的索引和数组对象。这 个函数返回的任何值都会作为第一个参数自动传给下一项。

reduce

reduce()方法从数组的第一项开始,逐个遍历到最后。

1
2
3
4
5
6
var nums = [1,2,3,4,5,6,7,8,9];
var sum = nums.reduce(function (prev,cur,index,array) {
return prev + cur;
});
console.log(sum); //45

reduceRight

reduceRight()则从数组的最后一项开始,向前遍历到第一项。

1
2
3
4
5
6
var nums = [1,2,3,4,5,6,7,8,9];
sum = nums.reduceRight(function (prev,cur,index,array) {
return prev + cur;
});
console.log(sum); //45
刘涤生 wechat