这个粉丝目前是一位准大四的学生,已经成功拿到美团实习生的offer,他拿到offer之后的第一时间就跟我来报喜,我听了以后非常的开心,自己的粉丝群能有人拿到大厂的offer。他本身也是个非常喜欢学习的好同志,经常找我问问题,看我给他的渡劫秘籍,能拿到这个offer也算是不辜负他的努力。未来可期,希望他能在程序员这条路上走出自己的一片天。
下面是他几轮面试题分享,看这难度对于一个校招生也是挺过分,好多问题一般的社招生能未必知道。
美团一面
- 介绍一下项目的背景和自己充当的一个角色,还问了一些关于项目的一些功能实现点(差不多10分钟)
- 基本的数据类型
- undefine和null的区别
- 如何检测当前变量是什么类型,有哪几种
- 说一下重排和重绘
- 如何实现响应式布局或者是弹性布局,有哪些方式
- 浏览器的渲染过程
- watch和computed的区别
- vue-router的实现原理(hash和history)
- 在项目中懒加载是怎么做的
- 前端的错误应该怎么处理,有哪些方式处理
- DNS的解析过程
- 说一说缓存(这里说了强缓存和协商缓存)
- 判断缓存是否过期有两个关键字,分别是哪两个
- 服务器内存泄漏了该怎么排查
- 深拷贝和浅拷贝的区别
- 说一说防抖和节流,并分别举一个应用场景
- 说一下实现节流的思路(我说了一个不用定时器的,她喊我说一个用定时器的节流)
- 手写题: 将一个数组转换为树形结构
美团二面
- 大文件上传是如何实现的
- 图片懒加载具体是怎么做的
- token无感刷新是怎么实现的
- 说一下js的基本类型和引用类型有哪些
- 基本类型和引用类型的区别是什么
- 基本数据类型和引用数据的使用方式有哪些区别
- 基本数据类型和引用数据类型的赋值有哪些区别
- 读代码题:
const a = [1,2,3,4] const b = a a.push(5)
, 问这个a和b的输出结果 - 当a被push(5)以后,怎么样才能使b不被改变
- 字符串做切分的方法有哪些
- 基本类型为什么可以调用方法
- 说一下原型和原型链,
- 平常项目中用过哪些关于原型链继承
- 类和对象的区别
- 说一下有哪些作用域
- 说一下let、var、const的区别
- 说一下浏览器的事件循环
- vue2的数据响应式原理
- 父子通信的方式有哪些
- 计算属性和函数有什么区别
- vue2里面发送请求在哪个生命周期里面去发
- 可以在beforCreate里面发吗
- 生命周期里面发请求会阻塞吗
- 创建vue示例的这个过程是同步的还是异步的
- 说一下this.$nextTick,应用场景是什么
- cookie的作用是什么
- 假如让你开发,cookie的作用是什么
- cookie是哪里发来的
- cookie的过期时间是谁设置的,cookie的携带是谁做的
- 哪些cookie是可以携带的
- 怎么解决跨域,有哪些方式
- 页面白屏怎么处理,需要考虑些什么
- 有哪些报错会让页面白屏 手写题: 原地打乱一个数组
- 手写一个虚拟列表
- 手写一个网络请求,获得结果后存储后再一小时删除
美团三面
-
从输入url到浏览器展示页面经历了些什么
-
讲一下DNS域名解析的过程
- 浏览器缓存检查:当用户在浏览器中输入一个网址时,浏览器首先检查自身的DNS缓存中是否有该域名对应的IP地址。如果有且未过期,直接使用该IP地址,解析过程结束。
- 操作系统缓存检查:如果浏览器缓存中没有找到相应的记录,操作系统会检查其自身的DNS缓存(包括hosts文件)。Hosts文件是一个本地的域名到IP地址的映射表,可以手动配置,如果这里存在记录,则直接使用,解析完成。
- 本地域名服务器(LDNS)查询:如果在本地也没有找到记录,请求会被转发到本地域名服务器(通常是ISP提供的,或者是局域网内的DNS服务器)。这台服务器通常维护着一个缓存,如果之前有其他用户查询过相同域名,可以直接返回结果。
- 递归查询:如果本地域名服务器也无法直接解析,它会代表客户端发起一个递归查询。首先,它会向根域名服务器发送请求。根域名服务器不会直接给出目标域名的IP地址,而是告知负责该顶级域名(如.com、.org)的顶级域名服务器(TLD)的地址。
- 顶级域名服务器查询:本地域名服务器接着向顶级域名服务器查询。顶级域名服务器会进一步指引到负责具体域名的权威域名服务器。
- 权威域名服务器查询:权威域名服务器存储着该域名的具体记录,包括A记录(IPv4地址)、AAAA记录(IPv6地址)等。一旦找到对应记录,权威域名服务器将IP地址返回给本地域名服务器。
- 结果返回与缓存:本地域名服务器接收到IP地址后,会将其返回给客户端,并且自己也会缓存这个结果,以便后续相同请求更快响应。同时,客户端浏览器也会缓存这个结果,减少未来重复查询的需要。
- TTL与缓存过期:整个过程中,DNS记录都带有TTL(Time To Live)值,这个值决定了记录在各级缓存中的有效时间。一旦TTL过期,相应的记录将从缓存中删除,下次查询时必须重新进行完整的解析流程。
-
本地储存这个ip会存多久
-
为什么这个ip会有时效性呢 主要基于以下几个原因和设定:
- DNS记录的TTL(Time To Live)值:这是DNS系统中非常关键的一个参数,每个DNS记录(如A记录、AAAA记录等)都会有一个TTL值,它定义了该记录可以在各级DNS缓存中保存的最大时间长度。TTL值由域名所有者在DNS配置中设置,可以根据需求调整,常见的范围可以从几分钟到几天不等。一旦TTL过期,缓存中的记录就需要被刷新,下次解析时将查询权威DNS服务器以获取最新IP。
- 递归解析器的缓存策略:用户的本地DNS递归解析器(如ISP提供的DNS服务器或公共DNS如Google Public DNS、Cloudflare DNS等)也会根据TTL值缓存DNS记录。即使用户的计算机重启,只要递归解析器还在运行且缓存未过期,就可以直接提供之前解析得到的IP地址。
- 客户端操作系统和浏览器缓存:除了外部DNS服务器,用户的操作系统(如Windows、macOS)和Web浏览器也会缓存DNS查询结果,通常也是遵循DNS记录的TTL值。这意味着即使递归解析器的缓存已清空,如果在TTL有效期内,客户端仍可能直接使用之前缓存的IP地址。
-
Tcp的建立过程和销毁过程
-
为什么要进行三次握手和四次挥手
-
http是由什么组成的
- 请求(Request):客户端向服务器发送一个数据包,请求获取某个网页、图片或其他资源。请求包括以下几个部分:
- 请求行(Request Line):包含请求方法(如GET、POST)、请求的URL和协议版本。
- 请求头(Request Headers):一系列键值对,提供了关于请求的附加信息,如用户代理(User-Agent)、接受的文件类型(Accept)、语言设置等。
- 请求正文(Request Body):在某些请求方法中(如POST),可能包含发送给服务器的数据。
- 响应(Response):服务器收到请求后,返回给客户端的一个数据包,确认请求并可能包含所请求的数据。响应包括:
- 状态行(Status Line):包含协议版本、状态码(如200表示成功,404表示未找到)和状态消息。
- 响应头(Response Headers):提供关于响应的附加信息,如内容类型(Content-Type)、内容长度(Content-Length)、缓存控制(Cache-Control)等。
- 响应正文(Response Body):通常包含请求的资源数据,如HTML文档、图片、JSON数据等。
- 请求(Request):客户端向服务器发送一个数据包,请求获取某个网页、图片或其他资源。请求包括以下几个部分:
-
什么是报文体
报文体(Payload)是数据报文中的主体内容部分,它承载了实际要传输的数据。在计算机网络通信中,一个完整的报文通常由报头(Header)和报文体两部分组成。报头包含了控制信息和元数据,例如源地址、目标地址、协议标识、数据长度等,用于帮助数据正确传输和处理。而报文体则包含了通信双方真正关心的具体信息,比如文本消息、图片数据、音频视频流、文件内容等。
报文体的格式和内容依赖于应用层的协议和数据类型。例如,在HTTP请求中,报文体可能包含POST请求提交的表单数据或JSON格式的数据;在电子邮件中,报文体就是邮件的实际文字内容。报文体的长度是可变的,可以根据实际传输需求来调整,并且在某些情况下,报文体可以是空的。 简单来说,报文体就是网络通信中去除所有控制和描述信息后,实际需要传输的有效载荷部分。
-
http发送的内容结构是什么样的
-
说一下进程和线程
- 进程(Process) 定义: 进程是操作系统进行资源分配和调度的基本单位,它是程序在一个数据集合上的一次动态执行过程。每个进程都拥有独立的地址空间、内存、打开的文件句柄、以及其他系统资源。简单来说,进程可以被看作是一个正在运行的程序实例。 特性: 独立性:每个进程都是独立的,一个进程崩溃不会直接影响到其他进程。 资源拥有:进程拥有自己的内存、打开的文件等资源。 上下文切换开销:由于进程间地址空间不共享,因此在进程之间的切换(上下文切换)需要保存和恢复大量的状态信息,开销较大。
- 线程(Thread) 定义: 线程是进程内的一个执行单元,是CPU调度的基本单位。一个进程中可以包含多个线程,这些线程共享该进程的地址空间和部分资源,但每个线程有自己的程序计数器、栈和局部变量等。 特性 轻量级:相比于进程,线程的创建和切换开销较小,因为它们共享进程的地址空间和其他资源。
- 并发与并行:线程使得程序能够在单个或多个处理器核心上实现并发执行,从而提高了程序的执行效率和响应速度。 通信简便:同一进程内的线程间通信相对容易,可以直接访问同一地址空间的数据结构和变量。
- 关系与区别 资源共享:线程之间可以直接访问同一进程内的资源,而进程之间需要通过进程间通信(IPC)机制来共享数据。 独立性与隔离性:进程之间相互独立,一个进程的异常不会直接影响到其他进程;而线程之间虽然共享资源,但一个线程的错误可能会破坏整个进程的稳定性。 开销与灵活性:创建和维护线程的开销通常小于进程,使得线程成为实现高并发、多任务处理的更灵活选择,尤其是在需要大量并发执行单元的场景下。
-
进程里面有什么数据结构进行存储的
最重要的进程数据结构是task_struct(在Linux内核中),它包含了描述一个进程或任务所需的所有必要信息。task_struct是一个复合数据结构,包含但不限于以下关键元素:
- 进程标识符(PID):唯一标识每一个进程的整数。
- 父进程标识符(PPID):指向创建该进程的父进程的PID。
- 进程状态:指示进程当前所处的状态,如运行、就绪、等待等。
- 程序计数器(PC):记录了进程在执行时的下一条指令地址。
- 内存管理信息:包括虚拟内存映射、页表指针、内存限制等。
- 文件描述符表:指向该进程打开的文件和I/O资源。
- 信号处理信息:定义了进程如何响应各种信号。
- 上下文信息:包括CPU寄存器的值,当进程被中断或调度时保存,恢复执行时恢复。
- 堆栈信息:记录函数调用和局部变量的堆栈段。
- 优先级和调度信息:影响进程调度策略和优先级的信息。
- 地址空间:描述了进程虚拟地址空间的布局,包括代码段、数据段、堆、栈等。
- 资源限制和计数器:如CPU时间使用限制、文件大小限制等。
- 线程专有信息:如果是多线程进程,还可能包含线程特有的数据,如线程局部存储(TLS)。
-
说一下浏览器的渲染原理
-
内存泄漏应该怎么去排查
-
手写节流
function throttle(fn, waitTime) {
let timer;
return function (...args) {
if (timer) return
timer = setTimeout(() => {
fn.apply(this, args)
timer = null
}, waitTime);
}
}
- 数组和链表有什么差别
- 说一下你知道的数据结构有哪些,并说一下他们的特点
- 手写一个队列
- 说一下一个队列函数需要有哪些功能
想要进渡劫群、看渡劫秘籍的扣在评论区。