JS中堆和栈的区别?

栈的特点是:先进后出,主要用来存储基本类型和函数的调用栈。
堆的特点是:可以随时动态分配和释放内存,主要用来存储引用类型的值,比如对象、数组等。

栈的分配和释放是自动的,由JS引擎自己来处理,而堆的分配和释放则需要手动来管理。JS提供了垃圾回收机制来自动回收不再使用的堆内存,以避免内存泄漏和程序崩溃。

浏览器从输入到显示经过了哪些步骤,输入url发生了什么?

  1. DNS解析出IP地址
  2. 浏览器向服务器发起请求
  3. 服务器响应请求,返回HTML文件以及其他资源文件
  4. 浏览器解析HTML,构建DOM树
  5. 根据CSS文件构建渲染树
  6. 执行JS代码,修改DOM或样式
  7. 将渲染树绘制到屏幕上,显示网页内容

JavaScrip中事件循环?

JS是一门单线程语言,同一时刻只能执行一个任务。因此引入了事件循环机制,使得异步执行和事件处理可以在后台执行,不影响主线程的执行。

同步任务在主线程执行,异步任务放到任务队列等待执行。
主线程完成同步任务后,执行任务队列中的待执行的异步任务。
异步任务执行完成后,会被放到任务队列中等待执行回调函数。

微任务优先于宏仁务执行。

说一下宏任务和微任务。

宏任务通常是浏览器端的API触发的,如setTimeout、setInterval、XMLHttpRequest等,也包括一些事件(如UI事件、鼠标事件、键盘事件)以及script标签的加载和执行。宏仁务会被添加到宏仁务队列,等待主线程执行完后被执行。

微任务是由JS本身的语法特性触发的,主要是Promise和MutationObserver。微任务会被添加到微任务队列中,而微任务队列会在当前宏仁务执行完毕之后立即执行。

另外,promise的then方法和catch方法会返回一个新的promise对象,因此它们产生的回调函数也是微任务,这种机制被称为“promise链”。

说一下原型、原型链。

在JS中,每个对象都有一个原型(prototype)属性,它指向另一个对象,而这个对象的原型又指向另一个对象,这样一直形成一个链式结构,被称为原型链。

原型是一个对象,它包含了共享属性和方法。当我们创建一个对象时,它会有一个隐含的原型属性__proto__,指向它的构造函数的原型对象。我们可以通过Object.getprototypeOf(obj)或者obj.__ proto __来获取一个对象的原型。

当我们访问一个对象的属性或者方法时,如果该对象本身没有该属性或方法,JS就会沿着原型链向上找,直到找到该属性或方法或者到达原型链的顶端null。这样就可以实现属性和方法的继承。

vue2和vue3的区别?

  1. vue3渲染速度更快,包体积更小
  2. 引入了CompositionAPI代替了选项式API,更加灵活和易于维护。
  3. 引入了teleport组件,可以帮助开发者在组件内部快速地创建弹出框、模态框等弹出式组件,而不需要考虑它在DOM结构中的位置。

computed和watch的区别?

computed用于定义计算属性,依赖其他变量进行计算得到的属性。计算属性可以缓存计算结果,在依赖的变量没有任何变化时可以直接返回之前的结果,提升性能。计算属性的的值也是响应式的,当依赖的变量发生变化的时候,计算属性的值会自动更新。

watch用于监听一个变量的变化,并在变化时执行特定的操作。当被监听的变量发生变化时,watch函数会被调用,可以在函数中执行需要的操作,例如发送请求、更新DOM等。
因此,computed用于定义计算属性,watch用于监听变量的变化并执行相应的操作

vue3中watch和watchEffect的区别?

watch要接收两个参数:要监听的数据对象和回调函数。当监听的数据对象发生变化时,回调函数会被调用。watch还支持更多的选项,例如deep、immediate、handler等。
watchEffect是vue3中新增的API,它可以自动追踪响应式数据的变化,并在数据变化时重新运行函数。watchEffect接收一个函数作为参数。当响应式数据变化时,watchEffect函数会重新运行,并更新相关的视图。watchEffectc不支持像watch那样的选项,但可以通过其他方式实现类似的功能。

总之,watch更加灵活,可以实现更多的高级功能,但是需要手动监听数据和编写回调函数。watcheffect则更简单,只需要传入一个函数即可自动追踪数据变化,并且可以直接在函数中使用响应式数据。如果只需要监听数据变化并重新运行函数,可以使用watcheffect实现,但是想要使用更加高级的功能,例如监听多个数据,深度监听数据等,需要使用watch。

常见的五大算法

分治算法:将一个大问题分解成若干子问题,递归地解决子问题,再将子问题的解合并起来,得到更大的解。例如归并排序和快速排序就是分治算法的典型代表。
动态规划算法:将一个复杂的问题分解成若干个子问题,通过求解子问题的最优解,来求解原问题的最优解。动态规划算法常用于求解具有重叠子问题和最优子结构性质的问题。例如背包问题和最优子序列问题就是动态规划算法的典型代表。
贪心算法:在对问题求解时,总是做出当前看来最好的选择,而不考虑将来的后果。贪心算法通常需要证明贪心选择的正确性,典型代表有哈夫曼编码和最小生成树问题。
回溯算法:回溯算法是一种搜索算法,它通过不断地在每一步选择不同的可能性来寻找问题的解。回溯算法通常在解空间树上实现,它的具体实现方式是尝试所有可能的选项,并在不符合要求的情况下回溯上一步,重新选择其他的选项。八皇后问题和数独问题就是回溯算法的典型代表。
分支界定算法:分支界定算法是一种搜索算法,它通过不断地将问题分解成若干个子问题并逐步求解,来寻找问题的最优解。分支界定算法将问题空间看作一个树型结构,并在搜索过程中使用剪枝技术来减少搜索空间。TSP问题和0/1背包问题就是分支界定算法的典型代表。

口述递归实现斐波那契,给出表达式

使用递归的方法来实现fib(n),当n=0或1时候,直接返回n;n大于1时,用递归调用fib(n-1)加fib(n-2)的结果来计算fib(n)的值。

有用过node、docker吗

Node是一个JS运行环境,可以让JS在去、服务器端运行,Node提供了一些内置模块和API,可以方便地进行服务器端开发。例如HTTP请求,文件操作、数据库访问等。还具有事件驱动、异步编程等特性。

docker是一个开源的容器化平台,可以让开发者将应用程序和依赖项打包成一个可移植的镜像,并在不同的环境中运行。还提供了一些命令行工具和API,可以方便地管理容器、镜像等资源。