除了 Object 之外,Array 类型恐怕是 ECMAScript 中最常用的类型了

创建数组的基本方式有两种

  • 使用 Array 构造函数

    1. var colors = new Array();
    2. var colors = new Array(20);
    3. var colors = new Array("red", "blue", "green");
  • 使用数组字面量表示法

    1. var colors = ["red", "blue", "green"]; // 创建一个包含 3 个字符串的数组
    2. var names = []; // 创建一个空数组
    3. var values = [1,2,]; // 不要这样!这样会创建一个包含 2 或 3 项的数组
    4. var options = [,,,,,]; // 不要这样!这样会创建一个包含 5 或 6 项的数组

检测数组

  • 对于一个网页,或者一个全局作用域而言,使用 instanceof 操作符就能得到满意的结果:
    1. if (value instanceof Array){
    2. //对数组执行某些操作
    3. }

    注意⚠️: instanceof 操作符的问题在于,它假定只有一个全局执行环境。如果网页中包含多个框架,那实 际上就存在两个以上不同的全局执行环境,从而存在两个以上不同版本的 Array 构造函数。如果你从 一个框架向另一个框架传入一个数组,那么传入的数组与在第二个框架中原生创建的数组分别具有各自 不同的构造函数。 为了解决这个问题,ECMAScript 5 新增了 Array.isArray()方法

  • Array.isArray()方法
    1. if (Array.isArray(value)){
    2. //对数组执行某些操作
    3. }

转换方法

指数组转字符串,主要包括一下几类:

  • toLocaleString()
  • toString()
  • valueOf()
  • join()
    1. var colors = ["red", "blue", "green"]; // 创建一个包含 3 个字符串的数组
    2. alert(colors.toString()); // red,blue,green
    3. alert(colors.valueOf()); // red,blue,green
    4. alert(colors); // red,blue,green
    其中的object.valueOf()指
  1. object.valueOf() 返回值为该对象的原始值

数组继承的 toLocaleString()、toString()和 valueOf()方法,在默认情况下都会以逗号分隔的字
符串的形式返回数组项。而如果使用 join()方法,则可以使用不同的分隔符来构建这个字符串。join()方
法只接收一个参数,即用作分隔符的字符串,然后返回包含所有数组项的字符串。请看下面的例子:

  1. var colors = ["red", "green", "blue"];
  2. alert(colors.join(",")); //red,green,blue
  3. alert(colors.join("||")); //red||green||blue

栈方法

栈是一种 LIFO(Last-In-First-Out,后进先出)的数据结构,也就是最新添加的项最早被移除。而栈中项的插入(叫做推入)和移除(叫做弹出),只发生在一个位置——栈的顶部。ECMAScript 为数组专门提供了 push()和 pop()方法,以便实现类似栈的行为。

  • push()方法可以接收任意数量的参数,把它们逐个添加到数组末尾,并返回修改后数组的长度
  • pop()方法则从数组末尾移除最后一项,减少数组的 length 值,然后返回移除的项
  1. var colors = new Array(); // 创建一个数组
  2. var count = colors.push("red", "green"); // 推入两项
  3. alert(count); //2
  4. count = colors.push("black"); // 推入另一项
  5. alert(count); //3
  6. var item = colors.pop(); // 取得最后一项
  7. alert(item); //"black"
  8. alert(colors.length); //2

队列方法

栈数据结构的访问规则是 LIFO(后进先出),而队列数据结构的访问规则是 FIFO(First-In-First-Out, 先进先出)

  • shift()方法 移除数组中的第一个项并返回该项,同时将数组长度减 1

    1. var colors = new Array(); //创建一个数组
    2. var count = colors.push("red", "green"); //推入两项
    3. alert(count); //2
    4. count = colors.push("black"); //推入另一项
    5. alert(count); //3
    6. var item = colors.shift(); //取得第一项
    7. alert(item); //"red"
    8. alert(colors.length); //2
  • unshift()方法 与shift()的用途相反,它能在数组前端添加任意个项并返回新数组的长度

    1. var colors = new Array(); //创建一个数组
    2. var count = colors.unshift("red", "green"); //推入两项
    3. alert(count); //2
    4. count = colors.unshift("black"); //推入另一项
    5. alert(count); //3
    6. var item = colors.pop(); //取得最后一项
    7. alert(item); //"green"
    8. alert(colors.length); //2

    重排序方法

    reverse()和 sort()方法的返回值是经过排序之后的数组。

  • reverse()方法 颠倒数组顺序

  • sort()方法 在默认情况下,按升序排列数组项——即最小的值位于最前面,最大的值排在最后面。为了实现排序,sort()方法会调用每个数组项的 toString()转型方法,然后比较得到的字符串,以确定如何排序
  1. var values = [1, 2, 3, 4, 5];
  2. values.reverse();
  3. alert(values); //5,4,3,2,1
  1. function compare(value1, value2) {
  2. if (value1 < value2) {
  3. return 1;
  4. } else if (value1 > value2) {
  5. return -1;
  6. } else {
  7. return 0;
  8. }
  9. }
  10. var values = [0, 1, 5, 10, 15];
  11. values.sort(compare);
  12. alert(values); // 15,10,5,1,0

操作方法

  • concat()方法可以基于当前数组中的所有项创建一个新数组。具体来说,这个方法会先创建当前数组一个副本,然后将接收到的参数添加到这个副本的末尾,最后返回新构建的数组
  1. var colors = ["red", "green", "blue"];
  2. var colors2 = colors.concat("yellow", ["black", "brown"]);
  3. alert(colors); //red,green,blue
  4. alert(colors2); //red,green,blue,yellow,black,brown
  • slice() 它能够基于当前数组中的一或多个项创建一个新数组。slice()方法可以接受一或两个参数,即要返回项的起始和结束位置。

    1. var colors = ["red", "green", "blue", "yellow", "purple"];
    2. var colors2 = colors.slice(1);
    3. var colors3 = colors.slice(1,4);
    4. alert(colors2); //green,blue,yellow,purple
    5. alert(colors3); //green,blue,yellow
  • splice方法 这个方法恐怕要算是最强大的数组方法了,它有很多种用法。splice()的主要用途是向数组的中部插入项

 删除:可以删除任意数量的项,只需指定 2 个参数:要删除的第一项的位置和要删除的项数。
例如,splice(0,2)会删除数组中的前两项。
 插入:可以向指定位置插入任意数量的项,只需提供 3 个参数:起始位置、0(要删除的项数)
和要插入的项。如果要插入多个项,可以再传入第四、第五,以至任意多个项。例如,
splice(2,0,”red”,”green”)会从当前数组的位置 2 开始插入字符串”red”和”green”。
 替换:可以向指定位置插入任意数量的项,且同时删除任意数量的项,只需指定 3 个参数:起
始位置、要删除的项数和要插入的任意数量的项。插入的项数不必与删除的项数相等。例如,
splice (2,1,”red”,”green”)会删除当前数组位置 2 的项,然后再从位置 2 开始插入字符串
“red”和”green”。

splice()方法始终都会返回一个数组,该数组中包含从原始数组中删除的项(如果没有删除任何
项,则返回一个空数组)。下面的代码展示了上述 3 种使用 splice()方法的方式

  1. var colors = ["red", "green", "blue"];
  2. var removed = colors.splice(0,1); // 删除第一项
  3. alert(colors); // green,blue
  4. alert(removed); // red,返回的数组中只包含一项
  5. removed = colors.splice(1, 0, "yellow", "orange"); // 从位置 1 开始插入两项
  6. alert(colors); // green,yellow,orange,blue
  7. alert(removed); // 返回的是一个空数组
  8. removed = colors.splice(1, 1, "red", "purple"); // 插入两项,删除一项
  9. alert(colors); // green,red,purple,orange,blue
  10. alert(removed); // yellow,返回的数组中只包含一项

位置方法

ECMAScript 5 为数组实例添加了两个位置方法:indexOf()和 lastIndexOf()。这两个方法都接收 两个参数:要查找的项和(可选的)表示查找起点位置的索引。其中,indexOf()方法从数组的开头(位 置 0)开始向后查找,lastIndexOf()方法则从数组的末尾开始向前查找

  1. var numbers = [1,2,3,4,5,4,3,2,1];
  2. alert(numbers.indexOf(4)); //3
  3. alert(numbers.lastIndexOf(4)); //5
  4. alert(numbers.indexOf(4, 4)); //5
  5. alert(numbers.lastIndexOf(4, 4)); //3
  6. var person = { name: "Nicholas" };
  7. var people = [{ name: "Nicholas" }];
  8. var morePeople = [person];
  9. alert(people.indexOf(person)); //-1

迭代方法

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

 every():对数组中的每一项运行给定函数,如果该函数对每一项都返回 true,则返回 true。
 filter():对数组中的每一项运行给定函数,返回该函数会返回 true 的项组成的数组。
 forEach():对数组中的每一项运行给定函数。这个方法没有返回值。
 map():对数组中的每一项运行给定函数,返回每次函数调用的结果组成的数组。
 some():对数组中的每一项运行给定函数,如果该函数对任一项返回 true,则返回 true。
以上方法都不会修改数组中的包含的值

  1. //every
  2. var numbers = [1,2,3,4,5,4,3,2,1];
  3. var everyResult = numbers.every(function(item, index, array){
  4. return (item > 2);
  5. });
  6. alert(everyResult); //false
  7. //some
  8. var someResult = numbers.some(function(item, index, array){
  9. return (item > 2);
  10. });
  11. alert(someResult); //true
  12. //filter
  13. var numbers = [1,2,3,4,5,4,3,2,1];
  14. var filterResult = numbers.filter(function(item, index, array){
  15. return (item > 2);
  16. });
  17. alert(filterResult); //[3,4,5,4,3]
  18. //map
  19. var numbers = [1,2,3,4,5,4,3,2,1];
  20. var mapResult = numbers.map(function(item, index, array){
  21. return item * 2;
  22. });
  23. alert(mapResult); //[2,4,6,8,10,8,6,4,2]
  24. //forEach
  25. var numbers = [1,2,3,4,5,4,3,2,1];
  26. numbers.forEach(function(item, index, array){
  27. //执行某些操作
  28. });

归并方法

ECMAScript 5 还新增了两个归并数组的方法:reduce()和 reduceRight()。这两个方法都会迭 代数组的所有项,然后构建一个最终返回的值。其中,reduce()方法从数组的第一项开始,逐个遍历

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

  1. //reduce
  2. var values = [1,2,3,4,5];
  3. var sum = values.reduce(function(prev, cur, index, array){
  4. return prev + cur;
  5. });
  6. alert(sum); //15
  7. //reduceRight
  8. var values = [1,2,3,4,5];
  9. var sum = values.reduceRight(function(prev, cur, index, array){
  10. return prev + cur;
  11. });
  12. alert(sum); //15