数组对象:一种特殊的对象
1. JS其实没有真正的数组,只是用对象模拟数组
JS数组不是典型数组
典型的数组
- 元素的数据类型相同
- 使用连续的内存存储
- 通过数字下标获取元素
JS的数组不这样
- 元素的数据类型可以不同
- 内存不一定是连续的(对象是随机存储的)
- 不能通过数字下标,而是通过字符串下标
- 这意味着数组可以有任何key,比如
let arr = [1, 2, 3]
arr['xxx'] = 1
2. 创建一个数组
2.1 新建
let arr = [1, 2, 3]
let arr = new Array(1, 2, 3)
let arr = new Array()
2.2 转化
let arr = '1,2,3'.split(',')
let arr = '123'.split('')
let arr = Array.from('123')
2.3 伪数组
没有数组共用属性的数组,就是伪数组
let divList = document.querySelectorAll('div')
伪数组的原型链中并没有数组的原型
2.4 合并两个数组
arr1.concat(arr2)
2.5 截取数组的一部分
==注意,JS只提供浅拷贝==
arr1.slice(1) //从第二个元素开始
arr1.slice(0) //全部截取
3. 增删改查
3.1 删
- 跟对象一样
let arr = ['a', 'b', 'c']
delete arr['0']
arr //[empty, 'b', 'c']
神奇,数组的长度并没有变
稀疏数组
- 如果直接改length可以删元素吗
重要:不要随便改length
let arr = [1, 2, 3, 4, 5];
arr.length = 1
居然可以
- 删除头部的元素
arr.shift() //arr被修改,并返回被删元素
- 删除尾部的元素
arr.pop() //arr被修改,并返回被删元素
- 删除中间的元素
arr.splice(index, 1) //删除index的一个元素
arr.splice(index, 1, 'x') //并在删除位置添加'x'
arr.splice(index, 1, 'x', 'y') //并在删除位置添加'x','y'
3.2 查
- 跟对象一样
let arr = [111, 222, 333]
arr[0]
- 索引越界
arr[arr.length] === undefined
arr[-1] === undefined
- 查找某个元素是否在数组里
arr.indexOf(item) //存在返回索引,否则返回-1
- 使用条件查找元素
arr.find(item => item % 2 === 0) //找第一个偶数
- 使用条件查找元素的索引
arr.findIndex(item => item % 2 === 0) //找第一个偶数的索引
3.3 增
- 在尾部加元素
arr.push(netItem) //修改arr,返回新长度
arr.push(item1, item2) //修改arr,返回新长度
- 在头部加元素
arr.unshift(netItem) //修改arr,返回新长度
arr.unshift(item1, item2) //修改arr,返回新长度
- 在中间添加元素
arr.splice(index, 0, 'x') //并index插入'x'
arr.splice(index, 0, 'x', 'y') //在index插入'x','y'
3.4 改
- 反转顺序
arr.reverse()
- 自定义顺序
arr.sort((a, b) => a - b)
4. 数组变换
4.1 map(n变n)
let arr = [0,1,2,2,3,3,3,4,4,4,4,6]
let arr2 = arr.map(function(x) {
let tmp = '周';
switch(x) {
case 0:
return tmp+'日';
break;
case 1:
return tmp+'一';
break;
case 2:
return tmp+'二';
break;
case 3:
return tmp+'三';
break;
case 4:
return tmp+'四';
break;
case 5:
return tmp+'五';
break;
case 6:
return tmp+'六';
break;
default:
return "未知";
}
});
console.log(arr2) // ['周日', '周一', '周二', '周二', '周三', '周三', '周三', '周四', '周四', '周四', '周四','周六']
4.2 filter(n变少)
let scores = [95,91,59,55,42,82,72,85,67,66,55,91]
let scores2 = scores.filter( x => x > 60);
console.log(scores2) // [95,91,82,72,85,67,66, 91]
4.3 reduce(n变1)
let scores = [95,91,59,55,42,82,72,85,67,66,55,91];
let sum = scores.reduce(function(sum,n){
return sum += n % 2 === 1 ? n : 0;
},0);
console.log(sum) // 奇数之和:598