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之上定义的方法。

posted @ 2019-06-08 17:01  找个地方随便坐  阅读(215)  评论(0编辑  收藏  举报