Skip to content

扁鹊健康前端面试

March 10, 2023 | 11:32 AM

扁鹊健康面试

第二次面试很明显比第一次好多了,没有那么紧张,情绪也没有失控,可能是没开视频的原因?感觉面试的时候还是得尽量严肃一点吧,控制好自己的情绪和面部表情才能够更好的回答问题,在面试前让自己冷静下来,像对待考试一样去对待每一场面试

2023/3/9 下午3点 面试官迟到了6分钟的样子 电话面试 本以为只会面试10分钟,结果面试了半小时

之前看牛客上的面经,以为是很简单的那种,结果大意了,把我简历扒拉干净了的感觉

一上来还是自我介绍

数据结构

一上来就进行数据结构的拷打呜呜,我数据结构很烂诶

  1. Array.prototype.sort():该方法可以对数组进行原地排序,即直接修改原数组,不会返回新的数组。默认情况下,它会将数组元素转换为字符串,然后按照Unicode码点排序。如果需要按照其他方式排序,可以传入一个比较函数作为参数。
  2. Array.prototype.reverse():该方法可以将数组中的元素按照相反的顺序重新排列,并返回新的数组。
  3. 冒泡排序(Bubble Sort):这是一种简单的排序算法,它重复地遍历要排序的数组,比较相邻的元素并交换位置,直到整个数组都已经排序。
  4. 快速排序(Quick Sort):这是一种快速的排序算法,它的基本思想是选择一个基准元素,然后将数组中的元素分为小于基准元素和大于基准元素的两部分,再对这两部分分别进行排序。
  5. 插入排序(Insertion Sort):这是一种简单的排序算法,它将数组分为已排序和未排序两部分,然后将未排序部分的第一个元素插入到已排序部分的正确位置上。
  6. 选择排序(Selection Sort):这是一种简单的排序算法,它将数组分为已排序和未排序两部分,然后从未排序部分选择最小的元素并放到已排序部分的末尾。
  7. 归并排序(Merge Sort):这是一种分治的排序算法,它将数组分成两个子数组,分别对这两个子数组进行排序,然后将排序后的子数组合并成一个有序的数组

快速排序的平均时间复杂度为 O(nlogn)。具体来说,当待排序数组的划分比较平均时,快速排序的时间复杂度是最优的。而当待排序数组已经有序或接近有序时,快速排序的时间复杂度会退化为 O(n^2)。

快速排序的时间复杂度分析如下:

  • 每次划分操作需要对整个数组进行一次遍历,时间复杂度为 O(n);
  • 快速排序的递归树的深度为 logn,因为每次划分都会将数组一分为二,所以深度为 logn;
  • 每次划分的时间复杂度为 O(n),因此快速排序的总时间复杂度为 O(nlogn)。

需要注意的是,快速排序的最坏时间复杂度为 O(n^2),但这种情况很少出现,通常情况下快速排序的时间复杂度为 O(nlogn),是一种高效的排序算法。

JavaScript 中,可以使用以下技巧来优化快速排序算法:

  1. 三数取中:在选择基准元素时,使用数组中间、头部和尾部的三个元素的中位数作为基准元素。这可以降低最坏情况的出现概率。
  2. 插入排序:在数组的长度小于某个值(如10)时,使用插入排序算法而不是快速排序。插入排序在处理小数组时比快速排序更快。
  3. 随机化数组:在每次执行快速排序时,随机打乱数组,以增加算法的随机性。
  4. 尾递归优化:使用尾递归优化快速排序的实现,避免栈溢出。

最差情况是每次选取的基准元素都是当前子数组中最大或最小的元素。在这种情况下,每次划分都只能排除一个元素,因此需要进行 n 次划分才能完成排序,时间复杂度为 O(n^2)。这种情况发生的概率非常低,但是如果数据本身就是有序的,或者是基本有序的,快排容易陷入最差情况。

后面突然问我计算机组成原理了解吗?把我吓到了,连忙说之前学过,但没怎么了解

CSS

CSS问题我记得不是很清楚了下次面试一定要录音!

js

  1. 语法不同:箭头函数使用箭头符号(=>)来定义函数,而普通函数使用关键字 function 来定义。
  2. this 的指向不同:箭头函数没有自己的 this,它会继承父级作用域中的 this 值。而普通函数中的 this 则是在函数被调用时动态确定的,它的值取决于调用函数的方式。
  3. 无法使用 arguments 对象:箭头函数没有自己的 arguments 对象,因此在箭头函数中使用 arguments 会引用外部作用域的 arguments
  4. 不能用作构造函数:箭头函数不能使用 new 关键字来创建实例,因为它们没有自己的 this,也没有原型对象。
  5. 没有原型:箭头函数没有 prototype 属性,因此不能通过它来定义方法。
  6. 没有自己的 arguments, super, new.target 对象:箭头函数没有自己的 arguments, super, new.target 对象,它们都是从外部继承的。

Promise 构造函数的参数为一个函数,这个函数接收两个参数:resolve 和 reject,它们分别表示 Promise 对象的两种状态:已解决(fulfilled)和已拒绝(rejected)

  1. 多个异步操作并行执行,且需要等待所有操作完成后进行下一步处理,比如从多个 API 接口获取数据,然后将所有数据合并到一起再进行渲染
  2. 多个异步操作中有一个操作失败就立即停止所有操作,并执行错误处理逻辑

定义对象的私有属性:Symbol 值作为属性名是唯一的,可以防止属性名的冲突,因此可以用来定义对象的私有属性

防止对象属性被意外修改:由于 Symbol 值是唯一的,因此可以用来定义对象属性,防止属性被意外修改

定义常量:由于 Symbol 值是唯一的,因此可以用来定义常量

定义枚举:由于 Symbol 值是唯一的,因此可以用来定义枚举

计算机网络

  1. 安全性:HTTP 传输的数据是明文的,容易被窃取和篡改,而 HTTPS 使用 SSL/TLS 加密传输数据,可以保证数据的机密性和完整性,防止数据被窃取和篡改
  2. 端口号:HTTP 默认使用端口号 80,而 HTTPS 默认使用端口号 443
  3. 证书:HTTPS 使用 SSL/TLS 协议对传输数据进行加密,需要使用证书对网站进行身份验证,防止中间人攻击。HTTP 不需要证书进行身份验证
  4. 速度:由于 HTTPS 使用 SSL/TLS 加密传输数据,会增加传输数据的时间和带宽消耗,因此速度比 HTTP 慢一些
  5. 缓存:HTTP 可以使用浏览器缓存来提高访问速度,而 HTTPS 在加密传输数据时会禁止浏览器缓存,以保证数据的安全性
  1. 客户端向服务器发起 HTTPS 请求,请求中包含了 SSL/TLS 支持的信息,比如支持的 SSL/TLS 版本号、加密算法等。
  2. 服务器返回证书给客户端,证书中包含了服务器的公钥、服务器的身份信息和证书的有效期等。
  3. 客户端验证服务器的身份,包括验证证书的有效性、证书是否过期、证书中的域名与服务器的域名是否一致等。
  4. 如果证书验证通过,客户端生成一个随机的加密密钥,并使用服务器的公钥进行加密,然后发送给服务器。
  5. 服务器使用私钥解密客户端发来的密钥,然后生成一个随机数作为会话密钥,并将会话密钥加密后发送给客户端。
  6. 客户端和服务器使用会话密钥进行数据传输,客户端和服务器之间的所有数据都使用会话密钥进行加密和解密,保证数据的机密性和完整性

项目

移动端媒体项目:

组件库项目:

git merge 命令会生成一个新的合并提交,并且会保留原来的分支历史记录,合并后的提交包含两个分支的修改。而 git rebase 命令则是将当前分支的修改应用到目标分支上,重新生成一颗新的分支历史记录,使得分支历史记录更加线性化

  1. 构建方式不同:Vite 利用 ES Modules 的特性进行构建,每个文件都是一个独立的模块,开发过程中只需要编译修改的文件,不需要每次都编译整个项目;而 Webpack 采用静态分析的方式进行构建,需要分析整个项目中的依赖关系,每次修改后需要重新编译整个项目。
  2. 开发体验不同:Vite 支持快速的热更新和即时预览,开发者可以在修改代码的同时,立即在浏览器中查看到最新效果;而 Webpack 需要重新编译后才能查看最新效果。
  3. 对 Vue 的支持:Vite 是 Vue.js 官方推荐的开发工具,内置了对 Vue 单文件组件的支持,可以直接在浏览器中运行 Vue 组件;而 Webpack 需要通过插件等方式进行支持。
  4. 总体来说,Vite 更适合于轻量级的应用,对于 Vue 单文件组件的支持更加完善,而 Webpack 则更适合于复杂的应用,可以通过插件等方式进行更加灵活的配置
  5. vite支持热重载

热重载(Hot Reload)是指在应用程序运行时对代码进行修改,而无需重新启动应用程序或重新加载整个页面,即可使更改的部分立即生效并反映在应用程序中。热重载可以帮助开发人员更快地调试和开发应用程序,同时减少开发周期

还有一些我就忘记了哈哈

反问

react 少部分是vue2

一周内吧

感觉还算是很不错的面试,基本上都回答出来了,不过这个是阿里的外包公司,一半员工都是阿里过去的,看了一下公司规模很小,估计也没hc让我进去,就当一次电话面试的体验了,加油!