7.1 创建数组
var a1 = [1, 2, 4, 6, 8]; // 使用数组直接量创建数组
var a2 = new Array(); // 创建一个数组
var a3 = new Array(10); // 创建一个长度为10的空数组
var a4 = new Array(1, 2, 4, 6, "test"); // 两个以上的参数将作为数组元素创建
7.2 数组元素的读和写
var a = [321, 3121, 1, 5];
a[-123] = 8; // 非有效索引值,作为数组的属性添加,不会更新数组长度
数组索引与属性的区别
数组也是一种特殊的经过封装的对象,其索引值相当于属性值。
所有的索引都是属性名,但只有在0~2的32次方 - 2之间整数属性名才是索引。
7.3 稀疏数组
7.4 数组长度
7.5 数组元素的添加与删除
7.6 数组遍历
7.7 多维数组
7.8 数组方法 (es3)
7.8.1 join(signal)
指定连接符连接数组,缺省为逗号
7.8.2 reverse()
将数组倒序并返回
7.8.3 sort(f)
将数组中的元素排序后返回。默认为升序。比较函数返回值大于0时表示需要重排。
var a = ['ant', 'Bug', 'cat', 'Dog'];
// 不区分首字母大小的字母表排序
a.sort(function (s, t) {
var a = s.toLowerCase();
var b = t.toLowerCase();
return a - b;
});
7.8.4 concat([e, …])
创建并返回一个新数组,它的元素包括调用数组元素以及每个参数。若参数为数组,则连接其子元素。
var a = [1, 2];
var b = [123, [3, 4]]
var b = a.concat(0, a); // [123, [3, 4], 0, 1, 2]
7.8.5 slice(start [, end])
返回调用数组start位置以及end位置之前一个元素的一个片段。若不指定end,则返回start到数组末尾的片段。
如果参数中出现负数,则表示是相对于数组最后一个元素位置的偏移量,-1表示末尾元素,-2表示倒数第二个元素。
7.8.6 splice(start, [num] [,e, …])
修改数组的通用方法。start指定修改起始位置;num指定删除元素个数,若不指定则到数组末尾;其后可以添加任意个参数插入到start后。
7.8.7 push(e [,e, …])/ pop()
7.8.8 unshift(e [, e, …])/shift()
7.8.9 toString()/toLocaleString()
7.9 数组方法 (es5)
es5的大多新增数组方法都接收一个函数,这个函数有三个参数:数组元素、数组索引以及数组本身。函数之外第二个参数是可选的,被看作是函数内this关键字的指向,缺省为调用数组本身。
对数组中的空缺元素不会调用传入的函数。
7.9.1 forEach(f)
从头至尾遍历数组,为每个元素调用指定的函数。
7.9.2 map(f)
将调用数组的用f处理并搜集返回值,最终返回一个数组。这个数组相比原数组具有相同的长度,相同的缺失元素。
7.9.3 filter(f)
返回调用数组经过f过滤后的一个子集。
f是过滤函数,返回一个布尔值,true则将当前遍历到的数组元素添加进子集中。
var dense = sparse.filter(function () { return true; });
7.9.4 every(f)/some(f)
传入函数对数组进行逻辑判断,功用类似数学里的全称量词以及存在量词。
7.9.5 reduce(f(x, y){} [, init])/reduceRight(f(x, y){} [, init])
使用f将数组元素进行组合,生成单个值。init是一个初始值,若不指定则首次调用f时x的值为数组的第一个元素。
x是到目前为止化简操作累积的结果。
reduceRight的工作原理跟reduce一样,不过它是从后往前处理数组的。
var a = [1, 2, 3, 4, 5];
var sum = a.reduce(function (x, y) { return x + y; });
var max = a.reduce(function (x, y) { return x > y ? x : y; });
上述函数调用都没有指定初始值,当数组为空时会抛出一个类型异常错误。
7.9.6 indexOf(key [, start])/lastIndexOf(key [, start])
搜索数组中具有给定值的元素的首个索引,若无则返回-1。lastIndexOf从后往前搜索。
start指定搜索起始索引。
运用start参数返回搜索值在数组中的全部索引:
function findAll (a, key) {
let res = [];
let pos = 0;
while(pos < a.length) {
if ((pos = a.indexOf(key, pos)) === -1) break;
else res.push(pos++);
}
return res;
}
7.10 数组类型
Array.isArray(object):判断一个对象是否为数组。
7.11 类数组对象
数组特性
1)当有新的元素添加到列表中时,自动更新length属性
2)设置length为一个较小值时将截断数组
3)从Array.prototype中继承一些有用的方法
4)其类属性为“Array”
类数组对象
拥有一个数值length属性和对应非负整数属性的对象。
很多数组算法都可以针对类数组对象进行工作。
var a = {'0': 'a', '1': 'b', '2': 'c'};
Array.prototype.join.call(a, '+');
Array.prototype.map.call(a, function (x) return x.toUpperCase(););
7.12 作为数组的字符串
字符串的行为类似于只读的数组。
因为字符串是不可变值,故当把它们当作数组看待时,它们是只读的。所以用push、sort等会修改数组的方法修改字符串时会报错。
var s = 'test';
s.charAt(0);
s[1]; // 用方括号代替了charAt方法调用
Array.prototype.join.call(s, ' '); // 't e s t'