苏小研前端一面(比较基础)
自我介绍
第一位面试官:
盒子模型相关
答案:前端页面中所有元素都可以看成是一个盒子模型,从内到外分别为content、padding、border、margin,分为两种盒子模型,一般我们常见的是标准盒子模型,即模型的宽度与高度分别为content的宽度与高度,另一种是IE怪异盒子模型,区别是其宽度与高度包含了border、padding和content,两种模型可以相互转换,转换规则为box-sizing: content-box(标准)、border-box(怪异)
状态码(我说了200、304、400、401、403、404、405、500、502、503)
答案:
- 1xx(信息性状态码):表示接收的请求正在处理。
- 2xx(成功状态码):表示请求正常处理完毕。
- 3xx(重定向状态码):需要后续操作才能完成这一请求。
- 4xx(客户端错误状态码):表示请求包含语法错误或无法完成。
- 5xx(服务器错误状态码):服务器在处理请求的过程中发生了错误。
这块内容太多了,大家可以自行查阅https://www.runoob.com/http/http-status-codes.html
http请求方法(get、post、put、delete)
答案:https://www.runoob.com/http/http-methods.html
http请求方法head(只请求首部)
答案:
Host:
此头部字段指定请求的主机名和/或端口号;Accept
:此头部字段指定客户端接受哪些类型的数据;Content-Type
:此头部字段指定在POST或PUT请求中发送的数据的类型;Content-Length
:此头部字段指定POST或PUT请求中发送的数据的长度;Cookie
:此头部字段包含由服务器发送的cookie信息,这些信息将在后续的请求中自动包含,以便服务器识别用户或保存状态信息;Authorization
:此头部字段用于向服务器提供身份验证信息,例如Bearer token或Basic authentication;Referer
:此头部字段指定原始URL,即从哪个URL页面跳转到了当前页面(可以结合CSRF回答)。
get与post的区别
答案:
- 安全性:与post相比,get的安全性较差,因为发送的参数是URL的一部分,post参数放在请求体中
- 数据长度限制:get长度受限,因为参数放在URL里面,URL最大长度是2048,而post无限制
- 缓存:get可以被缓存,post不行
- 幂等性:get对数据库中的数据不会造成影响,所以是幂等的,post非幂等
宏任务与微任务看代码说输出(题目忘记了,记住一个优先级就行,同步>微任务(promise中的then和catch、async、await)>宏任务(定时器))
事件循环
答案:js是单线程的,同一时间只能做一件事,将任务分为同步任务和异步任务,同步任务会立即执行,异步任务会在时机成熟后放入到队列中排队,等执行栈中所有同步任务都执行完毕,会不断的读取任务队列中的任务,如果有待执行的任务,会送入到执行栈中去执行,这个不断扫描的过程称为事件循环
git命令
答案:add commit push pull fetch merge reset revert rebase
细说rebase
答案:rebase是merge一个很好的替换命令,将两条commit记录合并成一条,获得更加线性、更加直观的commit记录
一道git场景题,已经有了好几个commit,但是要回到某个commit,而且不要那么多的commit记录(我说了git reset,面试官说也可以,应该不是最佳答案)
答案:应该revert好一些,但是revert仍然会保留很多的commit记录
Linux命令(不会,就说了一个ls)
答案:有一些偏后端了,这题不值得去看
部署相关(我回答了nginx)
答案:我主要是回答nginx配置项这些,如何通过nginx解决跨域
docker(只知道概念,不会,我用的pm2)
答案:docker是容器,可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。(复制的百度,建议大家可以自己研究一下,docker可以结合k8s,不过很偏后端了)
第二位面试官:
箭头函数的this
答案:箭头函数没有自己的this,在箭头函数内部访问的this则是上一层作用域的this。
call、apply、bind的区别
答案:
- 三者都可以改变函数this对象指向
- 三者第一个参数为this要指向的对象,如果没有这个参数或参数为null、undefined,则默认指向全局window或globalThis
- 三者都可以传参,apply是数组,call是参数列表(fn.call(obj, x1, x2, x3, ...)),apply和call是一次性传入参数,bind分为多次传入
- bind不会立即执行,而是返回绑定this后的函数,call和apply是立即执行
react、vue的区别
答案:
- 核心思想不同:vue核心是双向绑定;react是单向数据流,也可以通过state实现双向绑定
- 写法:vue无论是2还是3都是template语法,react18以来更加推崇函数式编程
- diff算法不同
不过我感觉这俩会越来越像,比如react支持hooks写法,使用高阶组件实现自定义hooks、而vue3组合式api也是推崇hooks写法的
前端性能优化方法
答案:这个很多,可以从减少打包体积、减少白屏时间等方面来说
promise
答案:三个状态之间的转换(pendding、fulfilled、rejected)
块级作用域(我说只知道作用域的概念,不太了解)
答案:任何一对花括号 {} 中的语句集都属于一个块,在这之中定义的所有变量在代码块外都是不可见的,我们称之为块级作用域。
变量提升
答案:我回答了var,函数及变量的声明都将被提升到函数的最顶部。
反问
#苏小妍面经##前端#