1. 定义
数组(array)是按次序排列的一组值。每个值的位置都有编号(从0开始),整个数组用方括号表示。
var arr = ['a', 'b', 'c'];
typeof arr;// object
Object.keys(arr)//返回数组的所有键名
// ["0", "1", "2"]
本质上,数组属于一种特殊的对象
typeof [1, 2,3];// object
数组对数字键的值的访问只能使用方括号结构不能使用点结构;但字符串键可以
var arr = [1, 2, 3];
arr.0 // SyntaxError
arr.foo = true;
arr // [1, 2, 3, foo: true]
arr.foo //true
2. length属性(可写)
如果人为设置一个小于当前成员个数的值,该数组的成员会自动减少到
length
设置的值。
var arr = [1, 2, 3];
arr.length = 2;
arr // [1, 2]
如果人为设置
length
大于当前元素个数,则数组的成员数量会增加到这个值,新增的位置都是空位。
var a = ['a'];
a.length = 3;
a[1] // undefined
3. 数组本质
数组本质上是一种对象,所以可以为数组添加属性,如果键名为字符串键名将不影响
length
属性的值。
length
属性的值就是等于最大的数字键加1,不合法的数字键则自动转化为字符串键名
let arr = [];
arr[-1] = 'a';
arr[Math.pow(2,23)] = 'b';
arr[100] = 'c';
arr.length // 101
arr[5] // undefined
4. 数组的遍历
- for…in 忽略数组空位
- delete方法会形成空位
let arr = [1, 2,, 3];
arr.foo = true;
// for循环
for(let i = 0; i < arr.length; i++) {
console.log(i);
}// 0,1,2,3
// while循环
// 正向遍历
let len = 0;
while(len < arr.length) {
...
len++;
}//结果同上
// 逆向遍历
let l = arr.length;
while(l--) {
...
}//结果同上
// forEach遍历
arr.forEach(i => {
console.log(i)
})// 1, 2, 3,遍历的是值,且跳过空位和字符串键名的值
// for...in
for(let item in arr) {
console.log(item);
}// 0,1,3,foo
5. 类数组对象
并不是数组,不具备数组特有的方法(push等)
所有键名都是正整数或零,并且有length
属性,只要有length
属性,就可以认为这个对象类似于数组
典型的类数组对象:函数的arguments
对象,以及大多数 DOM 元素集,还有字符串
var obj = {
0: 'a',
1: 'b',
2: 'c',
length: 3
};
可以通过call/apply方法转换为数组
call与apply的区别
call: 参数为多个参数
apply: 参数为两个参数,第二个参数为数组
const arr = []
Array.prototype.push.apply(arr, [1, 2];
同理,通过call/apply可以使用slice方法将类数组对象转化为数组
PS : 总感觉知识的整理抓不住重点,感谢指导
摘自
侵权删,不断完善中