1.数组的定义
任何类型的数据,都可以放入数组。如果数组的元素还是数组,就形成了多维数组。
var arr = [
{a: 1},
[1, 2, 3],
function() {return true;}
];
arr[0] // Object {a: 1}
arr[1] // [1, 2, 3]
arr[2] // function (){return true;}
var a = [[1, 2], [3, 4]];
a[0][1] // 2
a[1][1] // 4
2. 数组的本质
本质上,数组属于一种特殊的对象。typeof运算符会返回数组的类型是object。数组的特殊性体现在,它的键名是按次序排列的一组整数(0,1,2…)。JavaScript语言规定,对象的键名一律为字符串,所以,数组的键名其实也是字符串。之所以可以用数值读取,是因为非字符串的键名会被转为字符串。对象有两种读取成员的方法:“点”结构(object.key)和方括号结构(object[key])。但是,对于数值的键名,不能使用点结构。
typeof [1, 2, 3] // "object"
var arr = ['a', 'b', 'c'];
arr['0'] // 'a'
arr[0] // 'a'
Object.keys(arr)
// ["0", "1", "2"]
var arr = [1, 2, 3];
arr.0 // SyntaxError
3.length属性
只要是数组,就一定有length属性。该属性是一个动态的值,等于键名中的最大整数加上1。
var arr = ['a', 'b'];
arr.length // 2
arr[9] = 'd';
arr.length // 10
当数组的length属性设为2(即最大的整数键只能是1)那么整数键2(值为c)就已经不在数组中了,被自动删除了。上面代码表示,当length属性设为大于数组个数时,读取新增的位置都会返回undefined。
如果人为设置length为不合法的值,JavaScript会报错。
var arr = [ 'a', 'b', 'c' ];
arr.length // 3
arr.length = 2;
arr // ["a", "b"]
var a = ['a'];
a.length = 3;
a[1] // undefined
4.类数组对象
它们看上去很像数组,可以使用length属性,但是它们并不是数组,所以无法使用一些数组的方法。类似数组的对象只有一个特征,就是具有length属性。
//数组的slice方法将类似数组的对象,变成真正的数组。
var arr = Array.prototype.slice.call(arrayLike);
// for循环
function logArgs() {
for (var i = 0; i < arguments.length; i++) {
console.log(i + '. ' + arguments[i]);
}
}
// forEach方法
function logArgs() {
Array.prototype.forEach.call(arguments, function (elem, i) {
console.log(i+'. '+elem);
});
//字符串也是类似数组的对象,所以也可以用Array.prototype.forEach.call遍历。
Array.prototype.forEach.call('abc', function(chr) {
console.log(chr);
});
// a
// b
// c
}
5.in 运算符
检查某个键名是否存在的运算符in,适用于对象,也适用于数组
var arr = [ 'a', 'b', 'c' ];
2 in arr // true
'2' in arr // true
4 in arr // false
var arr = [];
arr[100] = 'a';
100 in arr // true
1 in arr // false
6.for…in 循环和数组的遍历
for...in循环不仅可以遍历对象,也可以遍历数组,毕竟数组只是一种特殊对象。但是,for...in不仅会遍历数组所有的数字键,还会遍历非数字键。
var a = [1, 2, 3];
a.foo = true;
for (var key in a) {
console.log(key);
}
// 0
// 1
// 2
// foo
7.数组的空位
当数组的某个位置是空元素,即两个逗号之间没有任何值,我们称该数组存在空位(hole)。数组的空位不影响length属性。使用数组的forEach方法、for...in结构、以及Object.keys方法进行遍历,空位都会被跳过。如果某个位置是undefined,遍历的时候就不会被跳过。```javascript
var a = [1, 2, 3];
delete a[1];
a[1] // undefined
a.length // 3
网友评论