JS数据类型:数组
数组是一种特殊的对象。使用方括号来访问属性 arr[0] 实际上是来自于对象的语法。它其实与 obj[key] 相同,其中 arr 是对象,而数字用作键(key)。
数组声明
创建一个空数组有两种语法:
let arr = new Array(); let arr = [];
绝大多数情况下使用的都是第二种语法。我们可以在方括号中添加初始元素:
let fruits = ["Apple", "Orange", "Plum"];
数组元素从 0 开始自动编号。
我们可以通过方括号中的数字获取元素:
let fruits = ["Apple", "Orange", "Plum"]; alert( fruits[0] ); // Apple alert( fruits[1] ); // Orange alert( fruits[2] ); // Plum
可以替换元素:
fruits[2] = 'Pear'; // 现在变成了 ["Apple", "Orange", "Pear"]
或者向数组新加一个元素:
fruits[3] = 'Lemon'; // 现在变成 ["Apple", "Orange", "Pear", "Lemon"]
length 属性的值是数组中元素的总个数:
let fruits = ["Apple", "Orange", "Plum"]; alert( fruits.length ); // 3
也可以用 alert 来显示整个数组。
let fruits = ["Apple", "Orange", "Plum"]; alert( fruits ); // 弹出提示 内容为:Apple,Orange,Plum
数组可以存储任何类型的元素。
// 混合值 let arr = [ 'Apple', { name: 'John' }, true, function() { alert('hello'); } ]; // 获取索引为 1 的对象然后显示它的 name alert( arr[1].name ); // John // 获取索引为 3 的函数并执行 arr[3](); // hello
pop/push, shift/unshift 方法
队列(queue)是最常见的使用数组的方法之一。
pop
取出并返回数组的最后一个元素:
let fruits = ["Apple", "Orange", "Pear"]; alert( fruits.pop() ); // 移除 "Pear" 然后 alert 显示出来 let one = fruits.pop();// 移除 "Pear" 然后 保存到 one变量中 alert( fruits ); // Apple, Orange 这个时候数组fruits只剩下2个元素了。
push
在数组末端添加元素:
let fruits = ["Apple", "Orange"]; fruits.push("Pear"); alert( fruits ); // Apple, Orange, Pear 这个时候,数组多了一个元素
作用于数组首端的方法:
shift
取出数组的第一个元素并返回它:
let fruits = ["Apple", "Orange", "Pear"]; alert( fruits.shift() ); // 移除 Apple 然后 alert 显示出来 alert( fruits ); // Orange, Pear
unshift
在数组的首端添加元素:
let fruits = ["Orange", "Pear"]; fruits.unshift('Apple'); alert( fruits ); // Apple, Orange, Pear
push 和 unshift 方法都可以一次添加多个元素:
let fruits = ["Apple"]; fruits.push("Orange", "Peach"); fruits.unshift("Pineapple", "Lemon"); // ["Pineapple", "Lemon", "Apple", "Orange", "Peach"] alert( fruits );
性能对比
push/pop 方法运行的比较快,而 shift/unshift 比较慢。
原因是添加和移除最后一个内容的时候,前面的都不需要变化,而删除第一个元素的时候,后面的所有元素都需要向前推进一步,因为arr[0]被移走了,arr[1]要前移变成arr[0],就好像排队取票一样,第一个人走了,所有人要向前走,但是最后一个人走了,大家都不需要动。
循环
遍历数组最古老的方式就是 for 循环:
let arr = ["Apple", "Orange", "Pear"]; for (let i = 0; i < arr.length; i++) { alert( arr[i] ); }
数组来说还有另一种循环方式,for..of:
let fruits = ["Apple", "Orange", "Plum"]; // 遍历数组元素 for (let fruit of fruits) { alert( fruit ); }
for..of 不能获取当前元素的索引,只是获取元素值,但大多数情况是够用的。而且这样写更短。
关于 “length”
当我们修改数组的时候,length 属性会自动更新。准确来说,它实际上不是数组里元素的个数,而是最大的数字索引值加一。
例如,一个数组只有一个元素,但是这个元素的索引值很大,那么这个数组的 length 也会很大:
let fruits = []; fruits[123] = "Apple"; alert( fruits.length ); // 124
因此,我们要避免这种自定义索引的写法。
new Array()
这是创建数组的另一种语法:
let arr = new Array("Apple", "Pear", "etc");
它很少被使用,因为方括号 [] 更短更简洁。
多维数组
数组里的项也可以是数组。我们可以将其用于多维数组,例如存储矩阵:
let matrix = [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ]; alert( matrix[1][0] ); // 这样我们将得到 4
toString
数组有自己的 toString 方法的实现,会返回以逗号隔开的元素列表。
例如:
let arr = [1, 2, 3]; alert( arr ); //返回 1,2,3 alert( String(arr) === '1,2,3' ); // true
此外,我们试试运行一下这个:
alert( [] + 1 ); // "1" alert( [1] + 1 ); // "11" alert( [1,2] + 1 ); // "1,21"
我们会发现,输出的时候,数组自动转换成了字符串。