我的粉丝校招上岸美团啦

324 阅读13分钟

这个粉丝目前是一位准大四的学生,已经成功拿到美团实习生的offer,他拿到offer之后的第一时间就跟我来报喜,我听了以后非常的开心,自己的粉丝群能有人拿到大厂的offer。他本身也是个非常喜欢学习的好同志,经常找我问问题,看我给他的渡劫秘籍,能拿到这个offer也算是不辜负他的努力。未来可期,希望他能在程序员这条路上走出自己的一片天。

下面是他几轮面试题分享,看这难度对于一个校招生也是挺过分,好多问题一般的社招生能未必知道。

美团一面

  1. 介绍一下项目的背景和自己充当的一个角色,还问了一些关于项目的一些功能实现点(差不多10分钟)
  2. 基本的数据类型
  3. undefine和null的区别
  4. 如何检测当前变量是什么类型,有哪几种
  5. 说一下重排和重绘
  6. 如何实现响应式布局或者是弹性布局,有哪些方式
  7. 浏览器的渲染过程
  8. watch和computed的区别
  9. vue-router的实现原理(hash和history)
  10. 在项目中懒加载是怎么做的
  11. 前端的错误应该怎么处理,有哪些方式处理
  12. DNS的解析过程
  13. 说一说缓存(这里说了强缓存和协商缓存)
  14. 判断缓存是否过期有两个关键字,分别是哪两个
  15. 服务器内存泄漏了该怎么排查
  16. 深拷贝和浅拷贝的区别
  17. 说一说防抖和节流,并分别举一个应用场景
  18. 说一下实现节流的思路(我说了一个不用定时器的,她喊我说一个用定时器的节流)
  19. 手写题: 将一个数组转换为树形结构

美团二面

  1. 大文件上传是如何实现的
  2. 图片懒加载具体是怎么做的
  3. token无感刷新是怎么实现的
  4. 说一下js的基本类型和引用类型有哪些
  5. 基本类型和引用类型的区别是什么
  6. 基本数据类型和引用数据的使用方式有哪些区别
  7. 基本数据类型和引用数据类型的赋值有哪些区别
  8. 读代码题: const a = [1,2,3,4] const b = a a.push(5), 问这个a和b的输出结果
  9. 当a被push(5)以后,怎么样才能使b不被改变
  10. 字符串做切分的方法有哪些
  11. 基本类型为什么可以调用方法
  12. 说一下原型和原型链,
  13. 平常项目中用过哪些关于原型链继承
  14. 类和对象的区别
  15. 说一下有哪些作用域
  16. 说一下let、var、const的区别
  17. 说一下浏览器的事件循环
  18. vue2的数据响应式原理
  19. 父子通信的方式有哪些
  20. 计算属性和函数有什么区别
  21. vue2里面发送请求在哪个生命周期里面去发
  22. 可以在beforCreate里面发吗
  23. 生命周期里面发请求会阻塞吗
  24. 创建vue示例的这个过程是同步的还是异步的
  25. 说一下this.$nextTick,应用场景是什么
  26. cookie的作用是什么
  27. 假如让你开发,cookie的作用是什么
  28. cookie是哪里发来的
  29. cookie的过期时间是谁设置的,cookie的携带是谁做的
  30. 哪些cookie是可以携带的
  31. 怎么解决跨域,有哪些方式
  32. 页面白屏怎么处理,需要考虑些什么
  33. 有哪些报错会让页面白屏 手写题: 原地打乱一个数组
  34. 手写一个虚拟列表
  35. 手写一个网络请求,获得结果后存储后再一小时删除

美团三面

  1. 从输入url到浏览器展示页面经历了些什么

  2. 讲一下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过期,相应的记录将从缓存中删除,下次查询时必须重新进行完整的解析流程。
  3. 本地储存这个ip会存多久

  4. 为什么这个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地址。
  5. Tcp的建立过程和销毁过程

  6. 为什么要进行三次握手和四次挥手

  7. http是由什么组成的

    1. 请求(Request):客户端向服务器发送一个数据包,请求获取某个网页、图片或其他资源。请求包括以下几个部分:
      • 请求行(Request Line):包含请求方法(如GET、POST)、请求的URL和协议版本。
      • 请求头(Request Headers):一系列键值对,提供了关于请求的附加信息,如用户代理(User-Agent)、接受的文件类型(Accept)、语言设置等。
      • 请求正文(Request Body):在某些请求方法中(如POST),可能包含发送给服务器的数据。
    2. 响应(Response):服务器收到请求后,返回给客户端的一个数据包,确认请求并可能包含所请求的数据。响应包括:
    • 状态行(Status Line):包含协议版本、状态码(如200表示成功,404表示未找到)和状态消息。
    • 响应头(Response Headers):提供关于响应的附加信息,如内容类型(Content-Type)、内容长度(Content-Length)、缓存控制(Cache-Control)等。
    • 响应正文(Response Body):通常包含请求的资源数据,如HTML文档、图片、JSON数据等。
  8. 什么是报文体

    报文体(Payload)是数据报文中的主体内容部分,它承载了实际要传输的数据。在计算机网络通信中,一个完整的报文通常由报头(Header)和报文体两部分组成。报头包含了控制信息和元数据,例如源地址、目标地址、协议标识、数据长度等,用于帮助数据正确传输和处理。而报文体则包含了通信双方真正关心的具体信息,比如文本消息、图片数据、音频视频流、文件内容等。

    报文体的格式和内容依赖于应用层的协议和数据类型。例如,在HTTP请求中,报文体可能包含POST请求提交的表单数据或JSON格式的数据;在电子邮件中,报文体就是邮件的实际文字内容。报文体的长度是可变的,可以根据实际传输需求来调整,并且在某些情况下,报文体可以是空的。 简单来说,报文体就是网络通信中去除所有控制和描述信息后,实际需要传输的有效载荷部分。

  9. http发送的内容结构是什么样的

  10. 说一下进程和线程

    • 进程(Process) 定义: 进程是操作系统进行资源分配和调度的基本单位,它是程序在一个数据集合上的一次动态执行过程。每个进程都拥有独立的地址空间、内存、打开的文件句柄、以及其他系统资源。简单来说,进程可以被看作是一个正在运行的程序实例。 特性: 独立性:每个进程都是独立的,一个进程崩溃不会直接影响到其他进程。 资源拥有:进程拥有自己的内存、打开的文件等资源。 上下文切换开销:由于进程间地址空间不共享,因此在进程之间的切换(上下文切换)需要保存和恢复大量的状态信息,开销较大。
    • 线程(Thread) 定义: 线程是进程内的一个执行单元,是CPU调度的基本单位。一个进程中可以包含多个线程,这些线程共享该进程的地址空间和部分资源,但每个线程有自己的程序计数器、栈和局部变量等。 特性 轻量级:相比于进程,线程的创建和切换开销较小,因为它们共享进程的地址空间和其他资源。
    • 并发与并行:线程使得程序能够在单个或多个处理器核心上实现并发执行,从而提高了程序的执行效率和响应速度。 通信简便:同一进程内的线程间通信相对容易,可以直接访问同一地址空间的数据结构和变量。
    • 关系与区别 资源共享:线程之间可以直接访问同一进程内的资源,而进程之间需要通过进程间通信(IPC)机制来共享数据。 独立性与隔离性:进程之间相互独立,一个进程的异常不会直接影响到其他进程;而线程之间虽然共享资源,但一个线程的错误可能会破坏整个进程的稳定性。 开销与灵活性:创建和维护线程的开销通常小于进程,使得线程成为实现高并发、多任务处理的更灵活选择,尤其是在需要大量并发执行单元的场景下。
  11. 进程里面有什么数据结构进行存储的

    最重要的进程数据结构是task_struct(在Linux内核中),它包含了描述一个进程或任务所需的所有必要信息。task_struct是一个复合数据结构,包含但不限于以下关键元素:

    1. 进程标识符(PID):唯一标识每一个进程的整数。
    2. 父进程标识符(PPID):指向创建该进程的父进程的PID。
    3. 进程状态:指示进程当前所处的状态,如运行、就绪、等待等。
    4. 程序计数器(PC):记录了进程在执行时的下一条指令地址。
    5. 内存管理信息:包括虚拟内存映射、页表指针、内存限制等。
    6. 文件描述符表:指向该进程打开的文件和I/O资源。
    7. 信号处理信息:定义了进程如何响应各种信号。
    8. 上下文信息:包括CPU寄存器的值,当进程被中断或调度时保存,恢复执行时恢复。
    9. 堆栈信息:记录函数调用和局部变量的堆栈段。
    10. 优先级和调度信息:影响进程调度策略和优先级的信息。
    11. 地址空间:描述了进程虚拟地址空间的布局,包括代码段、数据段、堆、栈等。
    12. 资源限制和计数器:如CPU时间使用限制、文件大小限制等。
    13. 线程专有信息:如果是多线程进程,还可能包含线程特有的数据,如线程局部存储(TLS)。
  12. 说一下浏览器的渲染原理

  13. 内存泄漏应该怎么去排查

  14. 手写节流

function throttle(fn, waitTime) {
  let timer;
  return function (...args) {
    if (timer) return
    timer = setTimeout(() => {
      fn.apply(this, args)
      timer = null
    }, waitTime);
  }
}
  1. 数组和链表有什么差别
  2. 说一下你知道的数据结构有哪些,并说一下他们的特点
  3. 手写一个队列
  4. 说一下一个队列函数需要有哪些功能

想要进渡劫群、看渡劫秘籍的扣在评论区。