不是典型的数组
- 典型的数组:元素的数据类型相同,使用连续的内存存储,通过数字下标获取元素
- JS数组:元素的数据类型可以不同,内存不一定是连续的(对象是随即存储的),不能通过数字下表而是通过字符串下标
这意味着数组可以有任何key,比如:
let arr = [1,2,3]
arr['xxx'] = 1
创建一个数组:
- 新建:
let arr = [1,2,3]
let arr = new Array(1,2,3)
let arr = new Array(3)
- 转化
let arr = '1,2,3'.split(',')
let arr = '123'.split('')
Array.from('123')
- 伪数组
let divList = document.querySelectorAll('div')
伪数组的原型链中并没有数组的原型,它的原型直接指向了对象的原型



创建一个数组:
- 合并两个数组,得到新数组
arr1.concat(arr2) //返回一个新数组 - 截取一个数组的一部分
arr1.slice(1) //从第二个元素开始
arr1.slice(0) //全部截取
注意,JS只是提供浅拷贝

增删改查:
删元素:
- 跟对象一样:
let arr = ['a','b','c']
delete arr['0']
arr // [empty,'b','c']
神奇,数组的长度并没有变化
- 如果直接改length可以删元素么
let arr = [1,2,3,4,5];
arr.length = 1
注:不要随便改length


- 删除头部元素
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'
查看所有元素:
- 查看所有属性名
let arr = [1,2,3,4,5];arr.x = 'xxx'
Object.keys(arr)
for(let key in arr){console.log(`${key}:${arr[key]}`)}
- 查看数字(字符串)属性名和值
for(let i = 0; i < arr.length ; i++){
console.log(`${1}:${[i]}`)
}
- 你要自己让
i从0增长到length - 1
arr.forEach(function(item,index){
console.log(`${index}:${item}`)
}) //遍历这个数组,每次都调用这个函数
也可以用 forEach / map 等原型上的函数
注:上面两种方法的区别:
- 当
for内部有break与continue时,forEach是不支持的. for循环是关键字,不是函数,所以其中没有函数作用域,只有块级作用域;而forEach是个函数,只有函数作用域
function forEach(array,fn){
for(let i = 0 ; i < array.length ; i++){
fn(array[i], i, array)
}
}
-
forEach用for访问array的每一项
-
对每一项调用fn(array[i],i,array)
-
为什么要传入array?
-
查看单个属性,跟对象一样:
-
let arr = [1,2,3]; arr[0] -
索引越界
-
arr[arr.length] === undefined -
arr[-1] === undefined -
举例
for(let i = 0; i < arr.length ; i++){
console.log(arr[i].toString())
} //报错:Cannot read property 'toString' of undefined
- 查找某个元素是否在数组里
arr.indexOf(item) //存在返回索引,否则返回-1- 使用条件查找元素
arr.find(item => item % 2 === 0) //找第一个偶数- 使用条件查找元素的索引
arr.findIndex(item => item % 2 === 0) //找第一个偶数的索引
增加数组中的元素
- 在尾部加元素
arr.push(newItem) //修改arr,返回新长度arr.push(item1,item2) //修改arr,返回新长度- 在头部加元素
arr.unshift(newItem) //修改arr,返回新长度arr.unshift(item1,item2) //修改arr,返回新长度- 在中间添加元素
arr.splice(index,0,'x') //在index处插入'x' ,在index位置什么都不删(0),加入'x'arr.splice(index,0,'x','y')


把字符串反转:现转换为数组再合并为字符串;

数组排序;


数组变换:

- map:n变n(一一映射)
- filter:n变少
- reduce:n变1
改表示数组各元素求和过程,reduce表示对它进行压缩,默认的初始值是0,每一次对取得的每一项,将项内两数相加,得到的值作为下一次的结果。
