Skip to content

数组

数组的本质

数组是一种特殊的对象,他的键是 0-n 的整数字符串,他的值可以是任意类型

之所以我们平常通过整数下标来访问元素,是因为JS在访问对象属性时,整数下标会被转换为字符串再访问。

js
var arr = ['a', 'b', 'c'];
Object.keys(arr)
// ["0", "1", "2"]

数组的length属性

数组的length属性是一个动态值,等于键名中最大整数 + 1,JS 使用一个32位整数,保存数组的元素个数。这意味着,数组成员最多只有 2^32 - 1 个,也就是说length属性的最大值就是 4294967295。

js
var arr = ['a', 'b'];
console.log(arr.length) // 2
arr[2] = 'c';
console.log(arr.length) // 3
arr[9] = 'd';
console.log(arr.length) // 10
arr[1000] = 'e';
console.log(arr.length) // 1001

// 清空数组
arr.length = 0
console.log(arr) // []

// 设置length大于当前元素个数,则数组的成员数量会增加到这个值,新增的位置都是空
arr[0] = 'a'
arr.length = 5
console.log(arr) // [ 'a',  <4 empty items> ]

一些运算符和表达式在数组上的支持

js
var arr= []
arr[0] = 'a'
arr.length = 5
// in 运算符用于判定对象是否存在key,也适用于数组, 但值为空的键会返回false
console.log(0 in arr) // ture
console.log(2 in arr) // false

// for..in 也同样支持数组, 不过会把非数字键也遍历到
// 一般采用for,while,forEach()来遍历数组, 这些方法会 跳过 empty item
var a = [1, 2, 3];
a.foo = true;
for (var key in a) {
  console.log(key);
}

// delete删除数组元素后,length不会改变,但那个位置会变成 empty item
var a = [1, 2, 3];
delete a[1];
a[1] // undefined
a.length // 3

类数组对象

类数组对象是具有类似数组的结构(所有键都是0和正整数,有length属性),但不是真正数组的对象。常见的类数组对象包括arguments对象和DOM节点集合。

这种类数组对象不具备:

  • 数组的特有方法Array.prototype上的方法
  • length属性不是动态的,不随成员变化

要将类数组转换为数组,可以通过数组的slice方法,或遍历类数组构造新数组

js
// 使用Array.prototype.slice.call()方法
var arr = Array.prototype.slice.call(arguments);