JavaScript中递归,深拷贝,异常处理,改变this的指向

递归

递归就是一个函数调用自己,递归方程以及递归结束条件,即给递归函数安排出口,否则会造成无限递归,无限递归会造成执行栈溢出,浏览器会报错

用递归实现斐波那契数列

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

  1. throw 抛出异常信息,程序也会终止执行
  2. throw 后面跟的是错误提示信息
  3. Error 对象配合 throw 使用,能够设置更详细的错误信息

try…catch

  1. try...catch 用于捕获错误信息
  2. 将预估可能发生错误的代码写在 try 代码段中
  3. 如果 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指向,后面可以传多个参数
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

史蒂文·月

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值