前端面试记录(一)

article/2024/5/23 1:10:54

面试时间:2023年2月3日14:00     前端实习

感想:第一次面试,没想到就面了个大厂(非头部大厂),0面试经验也非常紧张,看了一上午面经也没记住多少东西。其实问的问题非常简单,但是计算机基础不会,有一些前端基础也不记得了没答出来(虽然有看八股文但是还是不记得),算法题问的也很简单(但是我可能紧张什么的,只能记得最关键的那条dp代码)。很庆幸没让我写JS的代码。


目录

一、自我介绍

二、介绍项目

三、浏览器输入URL到整个页面加载完成的一个过程

四、浏览器的强缓存和协商缓存(http的缓存方式)

五、ES6新增的Set和Map的用法

六、weakSet和weakMap的了解

七、JS的拖拽功能了解吗

八、CORS实现跨域请求

九、Vue生命周期

十、与路由有关的生命周期是否了解

十一、Vue的diff算法的了解

十二、CommonJS和ES模块化的差异

十三、webpack5了解吗

十四、算法题

十五、反问环节


一、自我介绍

二、介绍项目

随便说了一下项目有什么功能,也没下一步问项目细节

三、浏览器输入URL到整个页面加载完成的一个过程

总体来说分为以下几个过程:

  1. DNS解析:查找以查找 IP 地址

  2. TCP连接:通过浏览器启动与服务器的 TCP 连接

  3. 发送HTTP请求:浏览器向 We 服务器发送 HTTP 请求,通信开始(请求响应过程)

  4. 服务器处理请求并返回HTTP报文

  5. 浏览器解析渲染页面

  6. 连接结束

四、浏览器的强缓存和协商缓存(http的缓存方式)

浏览器缓存分为强缓存和协商缓存,当存在缓存时,客户端第一次向服务器请求数据时,客户端会缓存到内存或者硬盘当中,当第二次获取相同的资源,强缓存和协商缓存的应对方式有所不同

强缓存:当客户端第二次向服务器请求相同的资源时,不会向服务器发送请求,而是直接从内存/硬盘中间读取

协商缓存:当客户端第二次向服务器请求相同的资源时,先向服务器发送请求"询问"该请求的文件缓存在本地与服务器相比是否更改,如果更改,则更新文件,如果没有就从内存/硬盘中读取
 

五、ES6新增的Set和Map的用法

方法说明
Setadd(value):添加某个值,返回 Set 结构本身(可以链式调用)。
delete(value): 删除某个值,删除成功返回true,否则返回false。
has(value):返回一个布尔值,表示该值是否为Set的成员。
clear():清除所有成员,没有返回值。
size得到当前Set的value个数
Mapset(key, val):向Map中添加新元素
get(key):通过键值查找特定的数值并返回
has(key):判断Map对象中是否有Key所对应的值,有返回true,否则返回false
delete(key):通过键值从Map中移除对应的数据
clear():将这个Map中的所有元素删除
size得到当前Map的键值对个数

<补充>Set和Map区别
1. Map是键值对,Set是值的集合,当然键和值可以是任何的值;

2. Map可以通过get方法获取值,而set不能因为它只有值;

3. 都能通过迭代器进行for...of遍历;

4. Set的值是唯一的可以做数组去重,Map由于没有格式限制,可以做数据存储

5. map和set都是stl中的关联容器,map以键值对的形式存储,key=value组成pair,是一组映射关

系。set只有值,可以认为只有一个数据,并且set中元素不可以重复且自动排序。

六、weakSet和weakMap的了解

WeakMap

WeakMap 对象的 key 只能是 Object 实例化的对象或者派生类的对象,如果不是的话,则会报错;WeakMap 对象的 value 可以是任意类型

WeakMap与Map的区别是:①不可遍历,②API 基本和 Map对象是一样的,但注意,并没有 size 属性和 clear() 方法

WeakSet

WeakSet 和 WeakMap 基本相同,存放的 value只能是 Object实例化的对象或者派生类的对象

与Set的区别:①并且不能迭代, ②没有 clear() 方法、size属性。

七、JS的拖拽功能了解吗

主要依靠3个事件,分别是onousedown鼠标按下、onmousemove鼠标移动和onmouseup鼠标抬起。

并且它们具体是按照这样的一个顺序执行的:event.clientX和event.clientY分别是鼠标当前的横坐标和纵坐标,offsetX 和 offsetY 分别表示元素的初始横坐标和纵坐标,移动的过程改变的是绝对定位下的left和top值。
 

八、CORS实现跨域请求

1、CORS需要浏览器和服务器同时支持,才可以实现跨域请求,目前几乎所有浏览器都支持CORS,IE则不能低于IE10。CORS的整个过程都由浏览器自动完成,前端无需做任何设置,跟平时发送ajax请求并无差异。实现CORS的关键在于服务器,只要服务器实现CORS接口,就可以实现跨域通信。

2、CORS分为简单请求和非简单请求(需预检请求)两类

3、对于简单请求,浏览器会直接发送CORS请求,具体说来就是在header中加入origin请求头字段。同样,在响应头中,返回服务器设置的相关CORS头部字段,Access-Control-Allow-Origin字段为允许跨域请求的源。请求时浏览器在请求头的Origin中说明请求的源,服务器收到后发现允许该源跨域请求,则会成功返回

4、当发生符合非简单请求(预检请求)的条件时,浏览器会自动先发送一个options请求,如果发现服务器支持该请求,则会将真正的请求发送到后端,反之,如果浏览器发现服务端并不支持该请求,则会在控制台抛出错误。如果非简单请求(预检请求)发送成功,则会在头部多返回以下字段:

Access-Control-Allow-Origin: http://localhost:3001  该字段表明可供那个源跨域
Access-Control-Allow-Methods: GET, POST, PUT         该字段表明服务端支持的请求方法
Access-Control-Allow-Headers: X-Custom-Header       实际请求将携带的自定义请求首部字段

九、Vue生命周期

系统自带:

  1. beforeCreate 
  2. created 
  3. beforeMount 
  4. mounted 
  5. beforeUpdate 
  6. updated 
  7. beforeDestroy 
  8. destroyed

如果加入keep-alive会多两个生命周期:activated  deactivated

十、与路由有关的生命周期是否了解

原文链接:https://blog.csdn.net/weixin_43221910/article/details/123228541

1. beforeRouteLeave => 2. beforeEach =>   3. beforeRouteUpdate => 4. beforeEnter => 

5. beforeRouteEnter => 6.beforeResolve => 7.afterEach

(组件路由:1,3,5  独享路由:4  全局路由:2,6,7)

路由的钩子函数,根据配置的地方不同,大致分为三种

第一种:全局路由

包含:①全局前置防守:router.beforeEach,(每次路由跳转前的处理,可以用来判断当前用户是否在登录状态,开始进度条等...);② 全局解析守卫:router.beforeResolve,(每次路由跳转完毕的处理,可以用来结束进度条等...);③全局后置防守:router.afterEach,(每次路由跳转完毕的处理,可以用来结束进度条等...)

第二种:独享路由

独享路由防守:beforeEnter (在进入路由时触发)

第三种:组件路由

包含:①组件路由:beforeRouteEnter(在渲染该组件的对应路由被验证前触发);②组件路由:beforeRouteUpdate (在当前路由改变,但是该组件被复用时调用);③组件路由:beforeRouteLeave(在导航离开渲染该组件的对应路由时调用)

十一、Vue的diff算法的了解

1、diff算法是一种通过同层的树节点进行比较的高效算法

2、有2个特点:①比较只会在同层级进行,不会跨层级比较,②在diff比较过程中,循环从两边向中间比较 

3、应用场景:在vue中,作用于虚拟dom渲染成真实dom的新旧VNode节点比较

十二、CommonJS和ES模块化的差异

  1. 为CommonJS的require语法是同步的,所以就导致了CommonJS模块规范只适合用在服务端,而ES6模块无论是在浏览器端还是服务端都是可以使用的,但是在服务端中,还需要遵循一些特殊的规则才能使用 ;

  2. CommonJS 模块输出的是一个值的拷贝,而ES6 模块输出的是值的引用

  3. CommonJS 模块是运行时加载,而ES6 模块是编译时输出接口,使得对JS的模块进行静态分析成为了可能

  4. 因为两个模块加载机制的不同,所以在对待循环加载的时候,它们会有不同的表现。CommonJS遇到循环依赖的时候,只会输出已经执行的部分,后续的输出或者变化,是不会影响已经输出的变量。而ES6模块相反,使用import加载一个变量,变量不会被缓存,真正取值的时候就能取到最终的值;

  5. 关于模块顶层的this指向问题,在CommonJS顶层,this指向当前模块;而在ES6模块中,this指向undefined

  6. 关于两个模块互相引用的问题,在ES6模块当中,是支持加载CommonJS模块的。但是反过来,CommonJS并不能requireES6模块,在NodeJS中,两种模块方案是分开处理的。

十三、Webpack5了解吗

Webpack 5 超详细解读(一)_webpack5 --config传参_5coder的博客-CSDN博客

十四、算法题

62. 不同路径 - 力扣(LeetCode)

var uniquePaths = function(m, n) {const dp = Array(m).fill().map(item => Array(n));   //创建一个二维数组//初始化向下走for (let i = 0; i < m; i++) {dp[i][0] = 1;  }//初始化向右走for (let i = 0; i < n; i++) {dp[0][i] = 1;}for (let i = 1; i<m; i++) {for (let j = 1; j<n; j++) {dp[i][j] = dp[i-1][j] + dp[i][j-1];}}return dp[m-1][n-1];
};

十五、反问环节

1、部门重视的技术:对于实习生,计算机基础,前端基础

2、使用的框架:Vue3

3、公司目前的业务

4、简历看中什么:实习生优先看学历,基本上也是看学历,因为投递的人太多,知道个人做不了什么大项目,筛选学历好的之后查看计算机基础和前端基础

5、多久后才能再次投递简历:半年后,因为简历一旦投递就被锁死了,换个部门投也是一样的


http://www.ngui.cc/article/show-861326.html

相关文章

高码率QPSK调制解调方案(2.1 QPSK调制)

2 全数字高码率QPSK调制解调软件设计 2.1 QPSK调制 2.1.1 QPSK调制原理 QPSK调制即正交相移键控信号,其信号表达式为 (1) 其中,和分别表示每比特的能量和持续

第6章 Linux 系统目录结构教程

Linux 系统目录结构 登录系统后&#xff0c;在当前命令窗口下输入命令&#xff1a; ls / 帅哥您会看到树状目录结构 以下是对这些目录的解释&#xff1a; /bin&#xff1a; bin 是 Binaries (二进制文件) 的缩写, 这个目录存放着最经常使用的命令。 /boot&#xff1a; 这里存…

上市条件 - 打造企业上市系列文章

一、只有股份公司才具备上市的资格; 二、申请上市公司&#xff0c;公司经营必须是3年以上&#xff0c;在这三年内没有更换过董事、高层管理人员、并且公司经营合法、符合国家法律规定; 三、上市公司的注册资金无虚假出资&#xff0c;没有抽逃资金的现象; 四、上市公司的注册资金…

03俯瞰全局:gRPC是如何进行通信的

gRPC作为Web网站和APP后端的最常用服务提供方式之一和分布式微服务架构不同节点间的最常见通信方式之一,它自身是如何进行通信的呢,这个问题就是我们本篇文章将要研究的重点,先从全局的角度分析gRPC服务端和客户端进行通信的主要流程,再从细节剖析gRPC是如何进行高效的远程…

Kafka入门(一)

1、Kafka简介 Kafka是一个分布式的基于发布/订阅模式的消息队列&#xff08;Message Queue&#xff09;&#xff0c;主要应用于大数据实时处理领域&#xff08;hadoop集群&#xff09;、物联网领域。其主要设计目标如下&#xff1a; 以时间复杂度为O(1)的方式提供消息持久化能…

【实际开发12】- 经验 experience

目录 1. 经验 experience 1. 无多大价值 , 停留数据展示层面 2. 保证数据一致性问题 3. 新增时 , 可先关注核心基础数据 ( 复杂数据以修改形式完善 ) 4. 新增 / 修改 ( 幂等性处理 ) 5. 增 / 删 / 改 添加日志 , 查询无需日志 6. 需要对接多模块的通用字段设计 : String…

值得拥有并收藏的 3个安卓/鸿蒙手机解锁软件

手机无论支持哪种操作系统&#xff0c;都占据了每个人口袋里的空间。随着大量移动设备的使用&#xff0c;搜索引擎上也出现了同样数量的查询&#xff0c;其中最常见的是提供安卓/鸿蒙屏幕锁定删除工具。由于安卓是当今最畅销的设备&#xff0c;我们的首要任务是为您提供最好的安…

并发编程学习案例-ReentrantReadWriteLock非公平的情况下读锁插队和写锁插队场景复现

文章目录一、前言二、源码三、 代码案例&#xff08;一&#xff09;复现写的时候插队场景参考执行结果&#xff08;二&#xff09;复现读的时候插队参考执行结果参考资料一、前言 Java ReentrantReadWriteLock 是 ReadWriteLock 的实现类&#xff0c;可以分出2把锁&#xff0c;…

2023年深圳CPDA数据分析师认证将于2/25正式开班,快来报名

CPDA数据分析师认证是中国大数据领域有一定权威度的中高端人才认证&#xff0c;它不仅是中国较早大数据专业技术人才认证、更是中国大数据时代先行者&#xff0c;具有广泛的社会认知度和权威性。 无论是地方政府引进人才、公务员报考、各大企业选聘人才&#xff0c;还是招投标加…

2023年关于redis,常常靠常常忘的知识点

一.使用过 Redis 分布式锁么&#xff0c;它是怎么实现的&#xff1f;先拿 setnx 来争抢锁&#xff0c;抢到之后&#xff0c;再用 expire 给锁加一个过期时间防止锁忘记了释放。如果在 setnx 之后执行 expire 之前进程意外 crash 或者要重启维护了&#xff0c;那会怎么样&#x…