递归
递归就是一个函数调用自己,递归方程以及递归结束条件,即给递归函数安排出口,否则会造成无限递归,无限递归会造成执行栈溢出,浏览器会报错
用递归实现斐波那契数列
function f(n) {
// 实现代码
if (n === 1 || n === 2) {
return 1;
}
return f(n - 1) + f(n - 2);
}
console.log(f(8)); //21
递归可以实现深拷贝
深浅拷贝
浅拷贝只复制一层对象的属性,二深拷贝则复制了所有的层级。
- 浅拷贝和深拷贝只针对引用类型
- 深拷贝:拷贝的是对象,不是地址
浅拷贝
只拷贝一层,如果是简单数据类型就拷贝值,如果是复杂数据类型就拷贝地址
深拷贝
深拷贝拷贝的是值,跟原数据没有关系
实现浅拷贝的方法
-
利用递归实现
<script> const obj1 = { uname: '张三', age: 18, gender: '男', gfs: ['凤姐', '芙蓉姐姐', '黄蓉'], wife: { w1: '蔡徐坤', w2: 'ikun' } } const obj2 = {} //封装函数 function deepCopy(newObj, oldObj) { //遍历对象 for (let k in oldObj) { const item = oldObj[k] //判断是否为数组 if (item instanceof Array) { //先创建一个空数组,再将要拷贝数组的值赋值给这个空数组 newObj[k] = [] deepCopy(newObj[k], item) } else if (item instanceof Object) { newObj[k] = {} deepCopy(newObj[k], item) } else { newObj[k] = item } } } deepCopy(obj2, obj1) console.log(obj1,obj2); </script>
-
利用
JSON
实现深拷贝 -
利用
lodash
库实现深拷贝
异常处理
throw
throw
抛出异常信息,程序也会终止执行throw
后面跟的是错误提示信息Error
对象配合throw
使用,能够设置更详细的错误信息
try…catch
try...catch
用于捕获错误信息- 将预估可能发生错误的代码写在
try
代码段中 - 如果
try
代码段中出现错误后,会执行catch
代码段,并截获到错误信息
this
普通函数
普通函数,this指向window
谁调用this就指向谁
普通函数没有明确调用者时 this
值为 window
,严格模式下没有调用者时 this
的值为 undefined
。
箭头函数
箭头函数中没有固定的this,箭头函数中的this指向父级作用域的this
不适合用箭头函数的清空
- 构造函数
- 事件回调
- 原型对象
改变this指向的三种方法
call
function fn(x,y){
console.log(this,x,y)
}
const obj={
uname:'张三'
}
fn.call(obj,10,20)
call
方法会立即调用函数,call
第一个参数为改变this的指向,后面可以传多个参数
apply
function fn(x,y){
console.log(this,x,y)
}
const obj={
uname:'张三'
}
fn.apply(obj,[10,20,30])
apply
方法会立即调用函数apply
有两个参数,第一个参数为要改变的this指向,第二个参数是一个数组
bind
function fn(x,y){
console.log(this,x,y)
}
const obj={
uname:'张三'
}
const ff=fn.bind(obj,10,20,30)
ff()
bind
不会立即调用函数,而是返回一个函数bind
第一个参数为要改变的this指向,后面可以传多个参数