JavaScript Array 类型总结

这里总结了 JavaScript 中 Array 的方法和属性。

创建一个数组

第一种方法是使用 Array 构造函数

var arr1 = new Array(); // 创建一个空数组
var arr2 = new Array(3); // 创建一个长度为3的数组,由于没有赋值,数组每一项均为 undefined
var arr3 = new Array('apple'); // 创建一个长度为1的数组,这一项值为 apple
// 这里的 new 都可以省略
var arr4 = Array(); // 省略 new 效果一样

第二种方法就是使用数组字面量

var arr1 = []; // 创建一个空数组
var arr2 = ['apple', 'banana']; // 创建一个包含2个字符串的数组

可以通过 length 属性获取一个数组的长度,该属性可读可写。

数组检测

判断一个对象是不是数组可以使用 instanceof 操作符,例如:

var a = ['apple'];
var b = 'apple';
console.log(a instanceof Array); // true
console.log(b instanceof Array); // false

在 ES5 中新增了 Array.isArray() 方法,这个方法更加准确

var a = ['apple'];
var b = 'apple';
console.log(Array.isArray(a)); // true
console.log(Array.isArray(b)); // false

转换方法

所有对象都有 toLocaleString(), toString(), valueOf() 方法,而数组也不例外。

var arr = ['apple', 'banana', 'orange'];
console.log(arr.toString()); // apple,banana,orange
console.log(arr.toLocaleString()); // apple,banana,orange
console.log(arr.valueOf()); // ["apple", "banana", "orange"]

另外,我们还可以使用 join() 方法来把数组转化为字符串,并且可以传入分隔符。

var arr = ['apple', 'banana', 'orange'];
console.log(arr.join()); // apple,banana,orange
console.log(arr.join('|')); // apple|banana|orange

栈方法

栈是一种 LIFO (Last-In-First-Out) 的数据结构,即后进先出,栈中项的插入(推入)和移除(弹出)只发生在栈的顶部。ECMAScript 专门为数组提供了 push()pop() 方法来实现类似栈的行为。

var arr = ['apple', 'banana'];
arr.push('orange'); // 向数组添加一项,返回数组的长度,此时为 3
console.log(arr); // 此时数组为: ["apple", "banana", "orange"]
var item = arr.pop(); // 移除数组最后一项,并返回该项
console.log(item); // orange

队列方法

队列是一种 FIFO (First-In-First-Out) 的数据结构,即先进先出。队列从列表的末端添加项,从列表的前端删除项。ECMAScript 提供了 shift() 方法,用于从列表中删除第一项,与 push() 方法结合可以模拟队列的行为。

var arr = ['apple', 'banana'];
var item = arr.shift(); // 删除数组的第一项,并返回该项
console.log(item); // apple
arr.push('orange'); // 从列表末端添加一项
console.log(arr); // ["banana", "orange"]

另外,ECMAScript 还提供了一个 unshift() 方法,用于在列表前端添加任意个项,它可以结合 pop() 方法来从相反的方向模拟队列。

var arr = ['apple', 'banana'];
arr.unshift('orange');
console.log(arr); // ["orange", "apple", "banana"]

重排序方法

数组提供了 reverse()sort()方法用来重排序,reverse() 用于翻转一个数组,sort() 默认按照升序排列一个数组。

var arr1 = ['apple', 'banana', 'orange'];
var arr2 = [1, 3, 15, 6, 10];
console.log(arr1.reverse()); // ["orange", "banana", "apple"]
console.log(arr1.sort()); // ["apple", "banana", "orange"],把刚才翻转的数组重新按照升序排列
console.log(arr2.reverse()); // [10, 6, 15, 3, 1]
console.log(arr2.sort()); // [1, 10, 15, 3, 6]

从上面代码可以看到,在使用 sort() 时,第二个数组并没有按照预期的结果进行升序排列。这是因为 sort() 在进行排序时,会先把每一项使用 toString() 转化为字符串,然后通过比较字符串来确定顺序,因此上面的结果就不正确了。

对于这个问题,sort() 可以接收一个比较函数作为参数,根据这个函数的返回值来确定顺序,如果第一个参数位于第二个参数之前则返回负数,两个参数相等返回 0,如果第一个参数位于第二个参数之后则返回正数,下面来看一个列子:

function compare(value1, value2) {
if (value1 < value2) {
return -1;
} else if (value1 > value2) {
return 1;
} else {
return 0;
}
}

var arr = [1, 3, 15, 6, 10];
console.log(arr.sort(compare)); // [1, 3, 6, 10, 15]

这个时候 sort 之后结果就正确了,如果需要按降序排列,只需修改返回值即可。另外,compare 函数还可以简写城如下形式:

function compare(value1, value2) {
return value1 - value2;
}

操作方法

位置方法

迭代方法

归并方法