1)深拷贝和浅拷贝的区别
浅拷贝是指创建一个新对象,复制原始对象的值到新对象中,如果原始对象的属性是引用类型,则只复制引用,而不是复制引用指向的对象。也就是说,新对象和原始对象会共享同一个引用类型的属性。
当进行浅拷贝时,如果修改新对象中的引用类型的属性,原始对象中的相应属性也会被修改,因为它们指向同一个引用。
浅拷贝一般使用 Object.assign()、扩展运算符(...)或 Array.slice() 等方法实现。
深拷贝是指创建一个新对象,尽管它的结构与原始对象相同,但是它是原始对象的完全独立的副本。也就是说,新对象和原始对象不会共享引用类型的属性。
当进行深拷贝时,无论修改新对象还是原始对象中的引用类型的属性,彼此之间都不会互相影响。
深拷贝一般需要通过递归或使用库函数(如 JSON.parse(JSON.stringify(object)))来实现。
2)什么是递归函数
递归函数是一种函数在其定义中调用自身的编程技巧。递归是一种常用的问题解决方法,它基于将一个复杂问题拆分成更小、相似的子问题来解决。递归函数在处理这些子问题时,会不断地调用自身,直到达到一个基本情况(终止条件)时停止,并返回结果。
递归函数通常由两部分组成:
递归调用:函数在其定义中调用自身,用于解决规模更小的子问题。
终止条件:定义在递归函数中的一个条件,用于判断是否需要继续递归调用。若满足终止条件,则递归停止。
递归函数的工作原理可以理解为不断地将大问题划分成小问题,通过解决小问题来逐步解决大问题。每次递归调用都会带着一个较小规模的子问题,直到达到终止条件并开始回溯,最终得到问题的解
3)js的this指向问题
this 不是固定不变的,它会随着执行环境的改变而改变。
在浏览器里,在全局范围内this 指向window对象;
在函数中,this永远指向最后调用他的那个对象;
构造函数中,this指向new出来的那个新的对象;
call、apply、bind中的this被强绑定在指定的那个对象上;
箭头函数中this比较特殊,箭头函数this为父作用域的this,不是调用时的this.要知道前四种方式,都是调用时确定,也就是动态的,而箭头函数的this指向是静态的,声明的时候就确定了下来;
apply、call、bind都是js给函数内置的一些API,调用他们可以为函数指定this的执行,同时也可以传参