1. 定义
? 数组就是按次序排列的一组值。每个值的位置都有编号(从0开始),整个数组用方括号表示。
var arr = [1, 2, 3]
任何类型的数据都可以放入数组。
var arr = [
{a: 1},
[1, 2, 3],
function() {
return false;
}
]
多维数组
var arr = [[1, 2], [3, 4]];
2. 数组的本质
本质上,数组是一种特殊的对象。对数组typeof 时会返回object 。
typeof [1, 2, 3]
既然对数组typeof 会返回object 。 那么数组的特殊性就体现在这,数组的索引会被当作键名,键名是按次序排列的整数。
var arr = [1, 2, 3];
Object.keys(arr);
JavaScript规定,对象的键名一律为字符串,所以,数组的键名其实也是字符串。所以可以使用数值读取,是因为非字符串的键名会自动转为字符串。
var arr = ['a', 'b', 'c'];
arr['0']
arr[0]
3. length属性
数组的length 属性,返回数组的成员数量
['a', 'b', 'c'].length
JavaScript使用32位整数储存数组元素个数,也就是说,数组成员最多只有2^32-1 个,length属性的最大值就是2^32-1 (4294967295)
length 是可写的,如果手动设置一个小于当前元素的个数的值,该数组的成员数量会减少到 length 设置的值。
var arr = [ 'a', 'b', 'c' ];
arr.length
arr.length = 2;
arr
清空数组的一个有效方法,将length 属性设置成0
var arr = [ 'a', 'b', 'c' ];
arr.length = 0;
arr
相反,如果设置 length 属性大于当前元素个数,则数组的成员数量会增加到这个值。新增的值都是空位 。
var a = ['a'];
a.length = 3;
a[1]
如果将 length 设置成不合法的值,JavaScript会报错。
[].length = -1
[].length = Math.pow(2, 32)
[].length = 'abc'
值得注意的是,数组本质上是一种对象,所以可以为对象添加属性。但这并不影响length 的值。(添加的属性不为整数时)
var a = [];
a['p'] = 'abc';
a.length
a[2.1] = 'abc';
a.length
length 属性的值就是最大数字键加1。
var arr = []
arr[100] = 1
arr.length
如果数组的键名超出范围,键名会自动转换为字符串。
var arr = [];
arr[-1] = 'a';
arr[Math.pow(2, 32)] = 'b';
arr.length
arr[-1]
arr[4294967296]
4. in 运算符
可以检查某个键名是否存在,适用于对象,适用于数组
var arr = [ 'a', 'b', 'c' ];
2 in arr
'2' in arr
4 in arr
如果数组的某个位置是空位,in 运算符返回false
5. for … in 循环和数组的遍历
for ... in 可以遍历数组
var a = [1, 2, 3];
for (var i in a) {
console.log(a[i]);
}
var a = [1, 2, 3];
a.foo = true;
for (var key in a) {
console.log(key);
}
6. 数组的空位
当数组的某个位置是空元素,即两个逗号之间没有任何值,我们称该数组存在空位(hole)。
var a = [1, , 1];
a.length
数组的空位读取时会返回undefined
var a = [, , ,];
a[1]
可以使用 delete 删除一个数组成员,这样会形成空位,并且不会影响 length 属性。
var a = [1, 2, 3];
delete a[1];
a[1]
a.length
数组的某个位置是空位,与某个位置是undefined ,是不一样的。如果是空位,使用数组的forEach 方法、for...in 结构、以及Object.keys 方法进行遍历,空位都会被跳过。
var a = [, , ,];
a.forEach(function (x, i) {
console.log(i + '. ' + x);
})
for (var i in a) {
console.log(i);
}
Object.keys(a)
如果某个位置是undefined ,遍历的时候就不会被跳过。
var a = [undefined, undefined, undefined];
a.forEach(function (x, i) {
console.log(i + '. ' + x);
});
for (var i in a) {
console.log(i);
}
Object.keys(a)
|