啃一啃犀牛书--数组(1)

啃一啃犀牛书–数组(1)

数组是我们经常使用到的数据结构。数组的定义:值的有序集合。

创建数组

1
2
3
4
5
var arr = [];                       // []
var newArr = new Array(5); // [undefined,undefined,undefined,undefined,undefined]
var arr4 = [1,2,3,4]; // [1,2,3,4]
var arr4n = new Array(1,2,3,4); // [1,2,3,4]
var arr3 = [,,,]; // [undefined,undefined,undefined]

数组直接量的语法允许有可选的结尾逗号

数组的读写

数组的读写使用”[]”操作符。

1
2
3
4
5
var a = [1];
var val = a[0];
a[1] = 2;
var i = 3;
a[i] = 4;

稀疏数组

稀疏数组就是包含从0开始的不连续索引的数组。我们可以使用Array()构造函数或者简单的指定数组的索引大于当前数组的长度来创建稀疏数组。

1
2
3
var a = new Array(5);
var b = [];
b[5] = 1;

也可使用delete操作符来产生稀疏数组。

足够稀疏的数组通常在实现上比稠密的数组更慢,内存利用率更高,在这样的数组中查找元素的时间
与常规的对象属性的查找时间一样长。

在权威指南上有一个错误,如下:

1
2
3
4
5
6
var a1 = [,,,];
var a2 = new Array(3);
0 in a1 // =>true 这里是错误的,这里得到的是false
0 in a2 // =>false
var a3 = [undefined,undefined,undefined]
0 in a3 //true a3[0]处有一个元素,该元素为undefined。

第三行,其实这里的a1与a2是近似相等的,他们的长度是3,但是里面的被插入的值缺都是不存在,这里并不等同于undefined。
在浏览器的验证 第三行也是错误的。

数组长度

这个大家应该都最熟悉不错了。数组的length属性。

数组元素的添加和删除

添加元素的最简单的方法,为新索引赋值。

1
2
3
4
5
6
7
8
var a = [];
a[0] = 1;
a[1] = 2;
//也可是使用push方法进行元素添加
var b = [];
b.push(1);
b.push(2);
b,push(3,4);

一些数组的方法会专门提出一章进行说明,也会包含es6里面一些数组新增的方法。

删除数组的元素,我们可以使用delete操作符。delete操作符删除元素,并不会改变数组的length属性,也就是不会改变数组的
长度,在删除的位置上会产生空位,使原来的数组变成稀疏数组。当然,我们也可以直接改变数组的长度来进行删除,但是这个在有些时候是不可控的。

1
2
3
4
var a = [1,2,3,4,5,6,7,8];
//删除最后一个
delete a[a.length-1]; //数组的长度不会改变
a.length = a.length - 1; //直接改变数组的长度

数组遍历

我们一般使用for循环,或者for/in 循环进行数组的遍历。

1
2
3
4
5
6
for(var i = 0;i< array.length;i++){
//执行具体的逻辑
}
for(var index in array){
//这里的index指array的属性值,在数组中,属性值即为索引(下标)
}

多维数组

js不支持真正的多维数组,但可以用数组的数组来近似。如果是二维数组,想当问某个元素,使用两次”[]”即可。这里的
多维数组也类似与点阵,如果你写过canvas或者其他的图形学的知识,你会发现多维数组的应用还是不错的。

本章先到这里,下一章主要内容是数组的方法,篇幅应该不会短,毕竟数组的方法其实也挺多的~~