## 函数
+ 作用域
- 含义
- 访问原则
- 赋值原则
+ 特殊的函数
- 匿名函数
- 自执行函数
- 递归函数
+ return两个作用
+ 随机数
+ Math.random()
## 数组(js里面最重要的数据类型) Array
+ 复杂的数据类型
+ 有序的数据集合
- 数组的有序性不是说数据往里面存放的时候会自动排序
+ 有序是体现在数组左侧的`下标` `索引`
+ 每往数组里面放一个数据 自动生成一个下标
+ 数组的长度
+ 数组名.length
+ 下标的范围
+ 0-数组的长度-1
+ 创建一个空数组
1. 字面量
+ var 数组名 = []
2. 内置构造函数
+ var 数组名 = new Array()
+ 往数组里面添加数据
1. 创建的时候添加初始化数据
+ var 数组名 = [11,2,23,4,5,6,67,2]
+ var 数组名 = new Array(11,2,23,4,5,6,67,2)
2. 动态给数组添加数据
+ 数组名.push(数据) 往数组的末尾添加一个数据
+ 数组名.unshift(数据) 往数组的开头添加一个数据
3. 通过下标的方式给数组添加数据
+ 数组名[下标] = 数据
+ 获取数组里面的数据
1. 根据下标的方式获取
+ 数组名[下标]
+ 越界访问取到的数据都是undefined 不会报错
2. 动态获取
+ var 数据 = 数组名.pop()
+ var 数据 = 数组名.shift()
+ 这种获取方式会改变数组的长度
+ 遍历数组
- 取出数组里面所有的数据
- 循环获取 先生成数组的下标范围 0 - 数组长度-1
+ 删除数组里面某一项数据
- delete 数组名[下标] 会删除数据 但是不会删除长度
- 数组名.splice(开始的下标, 删除个数)
+ 修改数组里面某一项数据
- 数组名[下标] = 数据
+ 判断数组里面是否包含某一项数据
- 数组名.indexOf(数据)
+ 找到了这个数据 返回第一个匹配数据对应的下标
+ 没有这个数据 固定返回-1
- 数组名.includes(数据)
+ 找到了这个数据 返回true
+ 没有找到这个数据 返回false
+ 数组的去重
- 新建一个数组取出老数组里面每一项 判断新数组里面是否包含这一项数据 如果不包含就放进去 包含就不放进去
+ 数组的拼接
- 数组名.concat(数组01,数组02, ...)
+ 数组的反转
- 数组名.reverse()
+ 数组的排序
- 冒泡排序
+ 双重for循环
+ 外层循环代表比较次数 次数=数组的长度-1
+ 内层循环代表每一次比较 每一次拿相邻的两项进行相比 如果前一项大于后一项 交换两项的位置
- 数组名.sort()
## 遍历数组
+ 利用for循环
- 生成一个下标的范围 0-数组长度-1
```js
for(var i=0;i<数组名.length;i++){
console.log('下标', i)
console.log('每一项', 数组名[i])
}
```
+ 利用for..in循环
```js
for(var 变量名 in 数组名){
console.log('下标', 变量名)
console.log('每一项', 数组名[变量名])
}
```
+ 利用for..of循环
```js
for(var 变量名 of 数组名){
console.log('每一项', 变量名)
}
```
+ 利用forEach
```js
数组名.forEach(function(item, index){
// item 代表数组里面每一项
// index 代表下标
})
```