【读书笔记】细读《JavaScript权威指南》(第七章: 数组)

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'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值