数组

数组是值的有序集合,JavaScript里的数组可以同时存放多种类型的元素,长度也是可以动态调整的。

 

创建数组

在JavaScript有多种方式创建数组

构造函数形式

通过构造函数,可以创建空数组,或事先指定数组长度和初期元素。

//无参构造函数,创建一空数组
var a1=new Array();
//一个数字参数构造函数,指定数组长度
var a2=new Array(5);
//带有初始化数据的构造函数,创建数组并初始化参数数据
var a3=new Array(4,'hello',new Date());

要注意的是,在使用构造函数创建数组时如果传入一个数字参数,则会创建一个长度为参数的数组, 如果传入多个,则创建一个数组,参数作为初始化数据加到数组中。

字面量形式

和使用构造函数一样,字面量形式也可创建空数组或带有初期元素的数组,但不能事先指定数组的长度。

//使用中括号,创建空数组,等同于调用无参构造函数
var a4=[];
//使用中括号,并传入初始化数据,等同于调用调用带有初始化数据的构造函数
var a5=[10];

索引和长度

数组的值可以通过自然数索引访问进行读写操作,例:

var a = [0,9,2];

a[1] = 1;
console.log(a[1]); // 输出:1

本质上,索引也是作为数组对象的一个属性存在的,不过因为JavasSript语法不允许数字作为变量名,所以不能以a.1这样的方式访问元素。

//接上面的例子代码
console.log(2 in a); // 输出:true
console.log(3 in a); // 输出:false

console.log(a.1); // 语法错

在JavaScript里,数组的索引可以不连续,与一般属性不一样的特殊之处是,通过指定索引的设值会自动更新length值,如下例所示:

//接上面的例子代码
console.log(a.length); // 输出:3
a[10] = 3;
console.log(a.length); // 输出:11

添加和删除元素

基本方法

如上面的例子所示,可以直接通过索引向数组添加元素。

栈方法

可以通过栈方法的push()和pop()在数组的尾部添加和删除元素。

//接上面的例子代码
a.push("bb");
console.log(a[a.length-1]); // 输出:bb
console.log(a.pop()); // 输出:bb

队列方法

可以通过队列方法的shift()和unshift()在数组的头部添加和删除元素。

//接上面的例子代码
a.unshift("hhh");
console.log(a[0]); // 输出:hhh
console.log(a.shift()); // 输出:hhh

批处理方法

使用splice()可以一次性的删除多个元素和添加多个元素,删除和添加同时执行的情况可以起到屁替换的效果。

var a = [1,2,3];
a.splice(1,1,9,8,7);
console.log(a);// 输出:[1,9,8,7,3]

查找元素

从数组中查找元素可以使用indexOf()或lastIndexOf()方法。

indexOf()返回指定元素值在数组中首次出现的位置,而lastIndexOf()返回指定元素值在数组中最后出现的位置,如果没有找到,则返回-1。

  var fruits = ["Banana", "Orange", "Apple", "Mango","Orange"];
  
  console.log(fruits.indexOf("Orange")); // 输出:1
  console.log(fruits.indexOf("西瓜")); // 输出:-1
  console.log(fruits.lastIndexOf(Orange)); // 输出:3
  console.log(fruits.lastIndexOf("西瓜")); // 输出:-1
  

另外,使用下面列举的数组遍历方法,可以实现各种更复杂的查找逻辑。

遍历数组

基本方法

基本方法就是用一个循环语句遍历数组的所有元素。

var a = [1,3,2];
for (var i=0;i<a.length;i++){
   console.log(a[i]); //输出(第一次执行):1 
                      //输出(第二次执行):3
                      //输出(第三次执行):2
}

every()方法

every()方法使用指定函数检测数组中的所有元素:

  • 如果数组中检测到有一个元素不满足,则整个表达式返回 false,且剩余的元素不会再进行检测。
  • 如果所有元素都满足条件,则返回true。
  • every() 不会对空数组进行检测。
  var ages = [32, 33, 16, 40];
  function checkAdult(age) {
    return age >= 18;
  }
  //检测数组的所有元素是否都大于18
  console.log(ages.every(checkAdult)); // 输出结果:false

filter()方法

filter()方法创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素,原数组不会变化。

  var ages = [32, 33, 16, 40];
  function checkAdult(age) {
    return age >= 18;
  }
  //将大于18的元素抽取生成新的数组,
  console.log(ages.filter(checkAdult));  // 输出: [32, 33, 40]

map()方法

map()方法返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值,原数组不会变化。

  var numbers = [4, 9, 16, 25];
  console.log(numbers.map(Math.sqrt)); // 输出: [2,3,4,5]

some()

some()方法用于检测数组中的元素是否满足指定条件。

some()方法会依次执行数组的每个元素,如果有一个元素满足条件,则表达式返回true , 剩余的元素不会再执行检测。

如果没有满足条件的元素,则返回false。 <code>

var ages = [3, 10, 18, 20];
function checkAdult(age) {
  return age >= 18;
}
ages.some(checkAdult); // 输出: true

<code>

其他操作

Array对象提供了数量众多的方法,详细请参考方法列表