Array类型
ECMAScript数组的每一项可以保存任何类型的数据,也就是说,而且数组的大小是可以动态调整的,即可以随着数据的添加自动增长以容纳新增数据。
var colors = [1, 'tg', {}];
在上面的例子中,数组中保存了数值、字符串和对象。
1、初始化数组实例
创建数组的基本方式有多种:
(1)使用Array构造函数
当传递一个参数时,如果传递的参数是数值,则会按照该数值创建包含给定项数的数组;如果是其他类型的参数,则会创建包含那个值的数组(只有一项)。
var colors1 = new Array();
var colors2 = new Array(20);
var colors3 = new Array('a',1);
在上面的代码中,第一行代码创建了一个空数组;第二行代码创建了一个length为20的属性;第三行代码创建了一个包含两个数组项的数组。
可省略new,但不推荐
var colors = Array();
(2)使用数组字面量
使用数组字面量表示法,由一对包含数组项的方括号表示,多个数组项之间用逗号隔开。
var colors = []; // 空数组
var colors2 = [1,2]; // 包含两个数组项的数组
数组的项数保存在其
length
属性中,不小于0,可读写。可通过减小来移除数组项。所有数组项默认是undefined(在不设置的情况下)。
2、检测数组(Array.isArray())
Array.isArray()
判断是否是数组,传入一个数组作为参数。
var colors = [];
console.log(Array.isArray(colors)); // true
console.log(Array.isArray(1)); // false
3、Array实例的方法(数组API)
(1)valueof()
varlueOf()
方法返回数组本身
var arr = [1,'test'];
console.log(arr.valueOf()); // [1,"test"]
(2)toStirng()
将数组中每个值的字符串拼接成一个字符串,中间以逗号隔开
var arr = [1,'test'];
console.log(arr.toString()); // 1,test
(3)push()
用于在数组的末端添加一个或多个元素,并返回添加新元素后的数组长度,该方法会改变原数组。
var arr = [];
console.log(arr.push(3)); // 1
console.log(arr.push(true)); // 2
console.log(arr); // [3, true]
(4)pop()
用于删除数组的最后一个元素,并返回该元素,该方法会改变原数组。
var arr = [1,'test'];
console.log(arr.pop()); // "test"
console.log(arr); // [1]
对空数组使用pop方法,不会报错,而是返回undefined。
(5)join()
以参数作为分隔符,将所有数组成员组成一个字符串返回。如果不提供参数,默认用逗号分隔。
var arr = [1, 'test'];
console.log(arr.join());
console.log(arr.join('||'));
注意:如果数组成员是undefined或null或空位,会被转成空字符串。
(6)concat()
用于多个数组的合并。它将新数组的成员,添加到原数组的尾部,然后返回一个新数组,原数组不变。
var arr = [1,'test'];
console.log(arr.concat([2],['a'])); // [1, "test", 2, "a"]
除了接受数组作为参数,concat也可以接受其他类型的值作为参数。它们会作为新的元素,添加数组尾部。
var arr = [1,'test'];
console.log(arr.concat('b',[2])); // [1, "test", "b", 2]
(7)shift()
用于删除数组的第一个元素,并返回该元素,该方法会改变原数组。
var arr = [1,'test'];
console.log(arr.shift()); // 1
console.log(arr); // ["test"]
(8)unshift()
用于在数组的第一个位置添加元素,并返回添加新元素后的数组长度,该方法会改变原数组。
var arr = [1,'test'];
console.log(arr.unshift('a')); // 3
console.log(arr); // ["a", 1, "test"]
unshift()
可添加多个元素:
var arr = [1,'test'];
console.log(arr.unshift('a','b')); // 4
(9)reverse()
reverse()
用于颠倒数组中元素的顺序,返回改变后的数组,该方法会改变原数组。
var arr = [1,'test'];
console.log(arr.reverse()); // ["test",1]
(10)slice() slice( start ,[end] )★★★
slice()
用于提取原数组的一部分,返回一个新数组,原数组不变。
第一个参数为起始位置(从0开始),如参数是负数,则表示倒数计算的位置。
第二个参数为终止位置(但该位置的元素本身不包括在内),如参数是负数,则表示倒数计算的位置。
如果省略第二个参数,则一直返回到原数组的最后一个成员。负数表示倒数第几个。
如果参数值大于数组成员的个数,或者第二个参数小于第一个参数,则返回空数组。
var arr = ['a','b','c','d'];
console.log(arr.slice(1,3)); // ["b", "c"]
console.log(arr.slice(2)); // ["c", "d"]
console.log(arr.slice(-2,-1)); // ["c"]
console.log(arr.slice(2,1)); // []
(11)splice() ★★★
splice()
用于删除原数组的一部分成员,并可以在被删除的位置添加入新的数组成员,返回值是被删除的元素,该方法会改变原数组。
第一个参数是删除的起始位置,如果是负数,就表示从倒数位置开始删除
第二个参数是被删除的元素个数。
如果后面还有更多的参数,则表示这些就是要被插入数组的新元素。
如只是单纯地插入元素,splice方法的第二个参数可以设为0。
如果只提供第一个参数,等同于将原数组在指定位置拆分成两个数组。
var arr = ['a','b','c','d'];
console.log(arr.splice(1,1)); // ["b"]
console.log(arr); // ["a", "c", "d"]
var arr = ['a','b','c','d'];
console.log(arr.splice(1,1,'f')); // ["b"]
console.log(arr); // ["a", "f", "c", "d"]
var arr = ['a','b','c','d'];
console.log(arr.splice(1,0,'h')); // []
console.log(arr); // ["a", "h", "b", "c", "d"]
(12)sort()
sort()
对数组成员进行排序,默认是按照字典顺序排序。排序后,原数组将被改变。
如果想让sort方法按照自定义方式排序,可以传入一个函数作为参数,表示按照自定义方法进行排序。该函数本身又接受两个参数,表示进行比较的两个元素。如果返回值大于0,表示第一个元素排在第二个元素后面;其他情况下(小于或等于),都是第一个元素排在第二个元素前面。
var arr = ['5','8','9','2'];
console.log(arr.sort()); // ["1", "2", "4", "5"]
var newArr = arr.sort(function(a, b) {
returnb - a;
});
console.log(newArr); // ["5", "4", "2", "1"]
注意:sort方法不是按照大小排序,而是按照对应字符串的字典顺序排序。也就是说,数值会被先转成字符串,再按照字典顺序进行比较。
(13)map()
map()
对数组的所有成员依次调用一个函数,根据函数结果返回一个新数组。
接受一个函数作为参数。该函数调用时,map方法会将其传入三个参数,分别是当前成员、当前位置和数组本身
var arr = [1,2,3];
var newArr = arr.map(function(v){
return v - 1;
});
console.log(newArr); // [0, 1, 2]
(14)forEach()
forEach()
遍历数组的所有成员,执行某种操作,参数是一个函数。它接受三个参数,分别是当前位置的值、当前位置的编号和整个数组。
var arr = ['a', 'b'];
arr.forEach(function(value,index){
console.log(index + ':' + value);
});
//
0 : "a"
1 : "b"
(15)filter()
filter()
参数是一个函数,所有数组成员依次执行该函数,返回结果为true的成员组成一个新数组返回。该方法不会改变原数组。
filter方法的参数函数可以接受三个参数,第一个参数是当前数组成员的值,这是必需的,后两个参数是可选的,分别是当前数组成员的位置和整个数组。
var arr = [1,2,3];
var newArr = arr.filter(function(v){
return (v > 2);
});
console.log(newArr); // [3];
(16)some()、every()
some()
用来判断数组成员是否符合某种条件。接受一个函数作为参数,所有数组成员依次执行该函数,返回一个布尔值。
该函数接受三个参数,依次是当前位置的成员、当前位置的序号和整个数组。只要有一个数组成员的返回值是true,则整个some方法的返回值就是true,否则false。
var arr = [1,2,3];
var bool = arr.some(function(v){
return (v == 3);
});
console.log(bool); // true
every()
用来判断数组成员是否符合某种条件。接受一个函数作为参数,所有数组成员依次执行该函数,返回一个布尔值。
该函数接受三个参数,依次是当前位置的成员、当前位置的序号和整个数组。所有数组成员的返回值都是true,才返回true,否则false。
var arr = [1,2,3];
var bool = arr.every(function(v){
return (v == 3);
});
console.log(bool); // false
var bool2 = arr.every(function(v){
return (v > 0);
});
console.log(bool2); // true
some和every方法还可以接受第二个参数,用来绑定函数中的this关键字。
(17)reduce()、reduceRight()
reduce()
依次处理数组的每个成员,最终累计为一个值。从左到右处理(从第一个成员到最后一个成员)
reduceRight()
依次处理数组的每个成员,最终累计为一个值。从右到左(从最后一个成员到第一个成员)
两个方法的第一个参数是一个函数,该函数可接收四个参数:
- 累积变量,默认为数组的第一个成员
- 当前变量,默认为数组的第二个成员
- 当前位置(从0开始)
- 原数组
对
reduce()
:
var arr = [1, 2, 3, 4, 5];
var total = arr.reduce(function(x, y){
console.log(x, y)
return x + y;
});
console.log(total);
// 1 2
// 3 3
// 6 4
// 10 5
//最后结果:15
对
reduceRight()
:
var arr = [1, 2, 3, 4, 5];
var total = arr.reduceRight(function(x, y){
console.log(x, y)
return x + y;
});
console.log(total);
// 5 4
// 9 3
// 12 2
// 14 1
// 15
两个方法还可传入第二个参数,表示累积变量的初始值:
(18)indexOf()、lastIndexOf()
indexOf()
返回给定元素在数组中第一次出现的位置,如果没有出现则返回-1。可以接受第二个参数,表示搜索的开始位置
lastIndexOf()
返回给定元素在数组中最后一次出现的位置,如果没有出现则返回-1。可以看作是从最后位置开始搜索。
var arr = ['a', 'b', 'a', 'c'];
console.log(arr.indexOf('a')); // 0
console.log(arr.indexOf('a',1)); // 2
console.log(arr.lastIndexOf('a')); // 2