数组
数组是值的有序集合,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对象提供了数量众多的方法,详细请参考方法列表。