#第7章 数组
- <a href="#no1">7.1 创建数组</a>
- <a href="#no2">7.2 数组元素的读和写</a>
- <a href="#no3">7.3 稀疏数组</a>
- <a href="#no4">7.4 数组长度</a>
- <a href="#no5">7.5 数组元素的添加和删除</a>
- <a href="#no6">7.6 数组遍历</a>
- <a href="#no7">7.7 多维数组</a>
- <a href="#no8">7.8 数组方法</a>
- <a href="#no9">7.9 `ECMAScript5`中的数组方法</a>
- <a href="#no10">7.10 数组类型</a>
- <a href="#no11">7.11 类数组对象</a>
- <a href="#no12">7.12 作为数组的字符串</a>
> 数组是值的有序集合。每个值叫做一个元素,而每个元素在数组中有一个位置,以数字表示,称为索引。
##<a name="no1">7.1 创建数组</a>
> 使用数组直接量是创建数组最简单的方法,在方括号中将数组元素用逗号隔开即可。
var arr = [];
> 调用构造函数`Array()是创建数组的另一种方法。`
var arr = new Array();
##<a name="no2">7.2 数组元素的读和写</a>
> 使用`[]`操作符来访问数组中的一个元素。数组的引用位于方括号的左边。方括号中是一个返回非负整数值的任意表达式。
##<a name="no3">7.3 稀疏数组</a>
> 稀疏数组就是包含从0开始的不连续索引的数组。通常,数组的`length`属性值代表数组中元素的个数。如果数组是稀疏的,`length`属性值大于元素的个数。可以用`Array()`构造函数或简单地指定数组的索引值大于当前的数组长度来创建稀疏数组。
##<a name="no4">7.4 数组长度</a>
> 每个数组有一个`length`属性。
##<a name="no5">7.5 数组元素的添加和删除</a>
> 我们见过的添加数组元素最简单的方法:为新索引赋值:
a = [];
a[0] = 'fc';
a[1] = 'man';
> 也可以用`push()`方法在数组的末尾增加一个或多个元素;
a = [];
a.push('fc');
a.push('man', 'hehe');
**可以使用`delete`运算符来删除数组元素。**
> **`pop()/push()/shift()/unshift()/splice()`**
##<a name="no6">7.6 数组遍历</a>
> 使用`for`循环是遍历数组元素最常见的方法。
##<a name="no7">7.7 多维数组</a>
**用二维数组作一个九九乘法表:**
//创建一个多维数组
var table = new Array(10); //表格有10行
for(var i = 0; i < table.length; i++){
table[i] = new Array(10); //每行有10列
}
//初始化数组
for(var row = 0; row < table.length; row++){
for(var col = 0; col < table[row].length; col++){
table[row][col] = row * col;
}
}
//使用多维数组来计算(查询)5 * 7
var product = table[5][7];
##<a name="no8">7.8 数组方法</a>
###7.8.1 join()
> `Arrya.join()`方法将数组中所有元素都转化为字符串并连接在一起,返回最后生成的字符串。可以指定一个可选的字符串在生成的字符串中来分隔数组的各个元素。如果不指定分隔符,默认使用逗号。
var x = [1,2,3,4];
x.join(); //=> '1,2,3,4'
x.join(' '); //=> '1 2 3 4'
x.join(''); //=> '1234'
**`Array.join()`方法是`String.split()`方法的逆向操作,后者是将字符串分割成若干块来创建一个数组。**
###7.8.2 reverse()
> `Array.reverse()`方法将数组中的元素颠倒顺序,返回逆序的数组。
var x = [1,2,3];
x.reverse(); //=> [3,2,1]
###7.8.3 sort()
> `Array.sort()`方法将数组中的元素排序并返回排序后的数组。当不带参数调用`sort()`时,数组元素以字母表顺序排序(如有必要将临时转化为字符串进行比较);
###7.8.4 concat()
> `Array.concat()`方法创建并返回一个新数组,它的元素包括调用`concat()`的原始数组的元素和`concat()`的每个参数。如果这些参数中的任何一个自身是数组,则连接的是数组的元素,而非数组本身。
var x = [1,2,3];
x.concat(4,5); //=> [1,2,3,4,5]
x.concat([4,5]); //=> [1,2,3,4,5]
x.concat([4,5],[6,7]); //=> [1,2,3,4,5,6,7]
x.concat([4,5,[6,7]]) //=> [1,2,3,4,5,[6,7]]
###7.8.5 slice()
> `Array.slice()`方法返回指定数组的一个片段或子数组。
###7.8.6 splice()
> `Array.splice()`方法是在数组中插入或删除元素的通用方法。
var a = [1,2,3,4,5,6,7,8];
a.splice(4); //返回[5,6,7,8]; a是[1,2,3,4]
a.splice(1,2); //返回[2,3,]; a是[1,4]
a.splice(1,1); //返回[4]; a是[1]
var a = [1,2,3,4,5];
a.splice(2,0,'a','b'); //返回[]; a是[1,2,'a','b',3,4,5]
a.spilce(2,2,[1,2],3); //返回['a','b']; a是[1,2,[1,2],3,3,4,5]
###7.8.7 push()和pop()
> `push()`和`pop()`方法允许将数组当做栈来使用。`push()`方法在数组的尾部添加一个或多个元素,并放回数组新的长度。`pop()`方法则相反:它删除数组的最后一个元素,减小数组的长度并放回它删除的值。
###7.8.8 unshift()和shift()
> `unshift()`和`shift()`方法的行为非常类似于`push()`和`pop()`,不一样的是前者是在数组的头部而非尾部进行元素的插入和删除操作。
###7.8.9 toString()和toLocaleString()
> 略
##<a name="no9">7.9 `ECMAScript5`中的数组方法</a>
###7.9.1 forEach()方法
> `forEach()`方法从头至尾遍历数组,为每个元素调用指定的函数。**三个参数分别是数组元素、元素的索引和数组本身。**
###7.9.2 map()
> `map()`方法将调用的数组的每个元素传递给指定的函数,并返回一个数组,它包含该函数的返回值。
a = [1,2,3];
b = a.map(function(x){
return x * x; //b是[1,4,9]
});
###7.9.3 filter()
> `filter()`方法返回的数组元素是调用的数组的一个子集。传递的函数是用来逻辑判定的:该函数返回`true`或`false`。
var x = [5,4,3,2,1];
y = x.filter(function(x){return x < 3}); // [2,1]
###7.9.4 every()和some()
> `every()`和`some()`方法是数组的逻辑判定:它们对数组元素应用指定的函数进行判定,返回`true`或`false`。
x = [1,2,3,4,5];
x.every(function(x){
return x < 10; //true 所有值都 < 10
});
x.every(function(x){
return x % 2 === 0; //false 不是所有的值都是偶数
});
###7.9.5 reduce()和reduceRight()
> `reduce()`和`reduceRight()`方法使用指定的函数将数组元素进行组合,生成单个值。
###7.9.6 indexOf()和lastIndexOf()
> `indexOf()`和`lastIndexOf()`搜索整个数组中具有给定值的元素,返回找到的第一个元素的索引或者如果没有找到就返回`-1`。
##<a name="no10">7.10 数组类型</a>
Array.isArray([]); //true
Array.isArray({}); //false
[] instanceof Array //true
({}) instanceof Array //false
##<a name="no11">7.11 类数组对象</a>
> 略
##<a name="no12">7.12 作为数组的字符串</a>
> `charAt()`
var s = test;
s.charAt(0); // 't'
s[1] // 'e'