1) var let const的区别
2) 嵌套循环 双重for循环执行流程
3) 数组内置方法
4) 函数
-
var let const的区别
区别: 变量提升 产生块级作用域 同名变量重复声明 变量重新赋值
var 会 不会 可以 可以
let 不会 会 不能 可以
const 不会 会 不能 不能使用注意:
let定义变量: 数据可以变化
cosnt定义常量: 数据一旦赋值就不能更改小结: 变化使用let 不变使用const
注意:
const锁定对象的地址,没有锁定数据,所以数据可以修改
-
嵌套循环-双重for循环 [ 了解 ]
//行
for(let i=1; i<=4; i++){//列 for(let j=1; j<3; j++){ console.log( '星' ) }
}
执行过程:
i=1 j=1 j=2
i=2 j=1 j=2
i=3 j=1 j=2
i=4 j=1 j=2
-
数组内置方法 [ 重点 ]
-
6-不影响原数组
arr.concat() : 合并数组
arr.join() : 数组拼接字符串
arr.slice() : 截取数组元素
arr.includes(): 判断是否含有某个元素arr.indexOf(): 返回数组元素索引
arr.flat() : 数组扁平化 -
7-影响原数组
arr.push() : 数组末尾追加元素
arr.unshift() : 数组之前追加元素
arr.pop() : 删除最后一个元素
arr.shift() : 删除第一个元素
arr.splice() : 添加 删除 替换元素arr.reverse() : 数组逆序
arr.sort() : 数组排序 -
7-遍历数组
- 筛选出第一个满足条件的值
arr.find(function (v, i){
})
- 筛选出第一个满足条件值的索引
arr.findIndex(function (v, i){
})
- 处理数据
arr.map(function (v, i){
})
- 过滤数据 == 数组过滤
arr.filter(function (v, i){
})
- 判断数组元素是否都满足指定条件
arr.every(function (v, i){
})
- 判断数组元素是否有一个满足指定条件 结果: 布尔值
arr.some(function (v, i){
})
- 遍历数组
arr.forEach(function (v){
})
面试题: forEach 和 map区别? 区别: 是否有返回值
- 筛选出第一个满足条件的值
-
-
函数 [ 重点 ]
-
2种定义方式
1> 声明式
function 函数名(形参1, 形参2, …形参n){ //具名函数return 结果; }
2> 表达式
const 变量名 = function (形参1, 形参2, …形参n){ //匿名函数return 结果; }
-
实参对象arguments - 了解
1> 每个函数都有一个实参对象: arguments, ES6箭头函数没有
-
参数默认值 - 重点
function 函数名(a, b, c=默认值, d=默认值){}
注意点: 有默认的参数应该在最后
-
函数封装 - 重点
封装思想: 封装为复用, 变化作参数 -
递归函数 - 了解
1> 概念: 函数内部对自身的调用 === 自己调自己
2> 理解:
递: 递进去 递归入口: 什么条件下递进去 (调用自己) 归: 归回来 递归出口: 什么条件下归回来 (不调用自己)
3> 案例:
需求: 求1 3 5 7 9…第n项的值规律: f(n) = f(n-1) + 2; f(n-1) = f(n-2) + 2; ... f(3) = f(2) + 2 f(2) = f(1) + 2; f(1) = 1 递归函数: function f(n){ if( n === 1){ //出口 return 1 }else{ //入口 return f(n-1) + 2; } }
4> 递归使用场景?
复杂问题 ====> 简单化复杂问题 ===> 大问题 ===> 小问题 ===> 更小的问题 ===> 简单问题
5> 递归缺点?
递归过程中会产生大量的执行栈,会常驻内存,严重时造成内存溢出 - 尽量少使用
6> 递归写法
a. 递归是一个函数
b. 必须有一个参数
c. 函数内部,必须有出口或者入口function 函数名(参数){ .... .... //入口 if(参数满足条件){ //调用自己 } //出口 if(参数满足条件){ //不在调用自己 } }
-