js-数组
前言
js中的数组是js对象的特殊形式,它有一些特殊行为需要注意。所有的数组都是构造于Array(),都从Array.prototype之上继承一套数组操作方法。
数组的定义
是值的有序列表。数组中的每个值都叫做一个元素,每个元素在数组中有一个位置,以数字来表示,称为索引。
js数组特性
这里简单列出需要注意的特性,之后详细说明重要的部分。
不限类型:数组中的元素可以是任意类型的,同一个数组中也可以拥有不同类型的元素。
动态:会根据需要增长或缩减,不需要在声明时指定数组元素中的个数。数组大小变化时不需要重新分配空间。(区别于真正意义上的数组,js中是使用对象实现的。)
是特殊的对象:第一门语言是java,刚学的时候经常搞出数组下标越界。js中的数本质是特殊对象,模拟的数组行为。访问不存在的下标时,只会单纯的返回undefined。
稀疏数组:数组中的索引不连续,存在空下标。
数组长度
每个数组都有一个length属性,就是这个属性让它区别于其他的js对象。
索引:js中的数组本质是对象,所有的索引其实都是属性名,但只有2~32的平方-2之间的整数才叫做索引0,区别于普通属性。
length的两个特殊行为:
为数组增加元素时(使用索引添加,使用索引之外的属性不会触发),length会自动加一。
为length属性设置一个小于当前长度的非负整数n时,当前那些下标大于等于n的元素会从数组中删除。
var arr = []; console.log(arr.length); // 0 // 添加一个元素之后数组长度+1 arr[0] = 1; console.log(arr.length); // 1 // 将length赋值为0之后数组被清空 arr.length = 0; console.log(arr); // []
稀疏数组
数组之间的索引可以不是连续的,他们之间可以有空值。当一个数组中存在不连续的索引,它就变成了稀疏数组。
var arr = [];
arr[0] = 1;
arr[2] = 3;
console.log(arr);
console.log(arr[1]);
下图是稀疏数组chrome下的输出,它为我们使用empty 标识了数组中空出的下表。访问空出的下表时,返回的是undefined。
避免产生稀疏数组
1,length属性不可靠,稀疏数组的length属性要少于其中元素的实际个数。
2,足够稀疏(存在大量不连续的下标)的数组在实现上比稠密数组更慢,内存利用率更高。查找元素的事件也跟常规对象查找属性时间一样长。
做为对象的数组
数组也是对象,也可以拥有自己的属性,我们可以使用这个特性做一些简单的时事情,复杂的逻辑还是使用普通对象。
var arr = [1,2,3];
// 使用了非索引属性,此时length属性并不会增加。
arr.name = "number";
小结:
1,数组是值的有序列表。
2,js中的数组特性:数组元素不限类型、长度会自动增加或减少、是特殊的对象、不连续的索引下的复制会形成稀疏数组。
3,可以数组的length属性删除数组元素,但不要给他设置大于数组长度的值,会形成稀疏数组。
4,可以拥有索引之外的属性,但不要滥用,复杂的操作还是交给普通对象,语义会更加明确。
5,所有的数组出自于内置的构造函数Array(),并共享Array.prototype之上定义的方法。