Array类型
ECMAScript 数组与其他语言中的数组都是数据的有序列表,但与其他语言不同的是,ECMAScript 数组的每一项可以保存任何类型的数据。也就是说,第一个位置可以保存字符串,而第二个位置可以保存数值,第三个位置又可以保存对象。
创建数组的基本方法有两种:
使用 Array 构造函数
var colors = new Array(); var colors = Array(); //可以省略 new 操作符 var colors = new Array(20); //指定数组长度 var colors = new Array('red','blue','yellow');PS: 传递一个值,并且这个值是数值的话,会创建该数值长度的数组,而不是长度为 1,值为该数值的数组。
使用数组字面量
var colors = ['red','blue','yellow'];
2.2.1 数组长度
获取数组长度用 .length 属性。
var colors = ['red','blue','yellow'];
alert(colors.length); //3
值得注意的是 .length 属性并不是只读的。我们可以通过设置这个属性的值,从数组末尾删除或添加新项。
var colors = ['red','blue','yellow'];
colors.length = 2;
alert(colors); //'red','blue'
colors.length = 4;
alert(colors[3]); //undefined
也可以通过下表的方式修改数组
var colors = ['red','blue','yellow'];
colors[10] = 'black';
alert(colors); //red,blue,yellow,,,,,,,,black
2.2.2 检测数组
确定某个对象是不是数组,使用 Array.isArray() 方法。
var colors = ['red','blue','yellow'];
console.log(Array.isArray(colors)); //true
2.2.3 转换方法
数字继承的 toLocaleString()、toString() 和 valueOf() 方法在默认情况下都会以逗号的字符串的形式返回数组项。
var colors = ['red','blue','yellow'];
alert(colors.toString()); //'red,blue,yellow'
alert(colors.valueOf()); //'red,blue,yellow'
使用 join() 方法则可以使用不同的分隔符来创建这个字符串
var colors = ['red','blue','yellow'];
alert(colors.join('|')); //'red|blue|yellow'
alert(colors.join('@')); //'red@blue@yellow'
2.2.4 栈方法和队列方法
栈 是一种 LIFO (后进先出)的数据结构,最新添加的项最早被移除。栈方法有 push()向末尾添加 和 pop()从末尾删除。
var colors = [];
colors.push('red','blue','yellow');
alert(colors); //red,blue,yellow
colors.pop();
alert(colors); //red,blue
队列 的访问规则是 FIFO(先进先出),从队列的末尾添加项 push(),从队列的前端移除项 shift()。此外还有一个方法 unshift() 可以在数组前端添加任意个项。
重排序方法
数组中有两个直接用来重排序的方法:reserve() 和 sort()。
reserve() 会反转数组项的顺序。
var values = [1,2,3,4,5];
values.reserve();
console.log(values); //5,4,3,2,1
sort() 先将数组项调用 toString() 方法,然后按从小到大排列。
var values = [0,1,5,10,23,56];
values.sort();
console.log(values); //0,1,10,23,5,56
另外,sort() 还可以接收一个 比较函数 作为参数
var values = [0,1,5,10,23,56];
values.sort(compare);
console.log(values); //0,1,5,10,23,56
function compare(value1, value2) {
if (value1 < value2) {
return -1;
} else if(value1 > value2) {
return 1;
} else {
return 0;
}
}
PS: 比较函数接收两个参数,如果第一个参数应该位于第二个参数之前则返回一个负数,如果第一个参数应该位于第二个参数之后则返回一个整数,如果这两个参数相等则返回0。
操作方法
concat() 基于当前数组中的所有项创建一个新数组。没有传递参数的情况下,只是返回当前数组的一个副本;如果传递参数将被添加到数组末尾。
var colors = ['red','green','blue'];
var colors2 = colors.concat('yellow',['black','brown']);
console.log(colors2); //red,green,blue,yellow,black,brown
slice() 基于当前数组中的一个或多个项创建新数组。如果传递一个参数,返回从该参数到当前数组末尾的所有项;如果传递两个参数,则返回两者之间的项(不包括结束位置)
var colors = ['red','green','blue'];
var colors2 = colors.slice(1,3);
console.log(colors2); //green,blue
位置方法
indexOf() 和 lastIndexOf() 这两个方法都接收两个参数:要查找的项和查找的起始位置。返回要查找的项在数组中的位置。(一个正着找,一个倒着找)
var numbers = [1,2,3,4,5,6,7,8,9];
alert(numbers.indexOf(4)); //3
alert(numbers.lastIndexOf(4)); //5