发布时间:2025-12-09 18:57:33 浏览次数:16
总体来说美团的面试相对还是对于八股的考察比较多的,但较为简单和基础,面试官也很温柔,比较友好。算法题也是比较基础的(可能前端考察的算法题较后端会简单一些)。
闭包有三个特性:
函数嵌套函数。
函数内部可以引用外部的参数和变量。
参数和变量不会被垃圾回收机制回收。
闭包的好处:
希望一个变量长期存储在内存中。
避免全局变量的污染。
私有成员的存在。
闭包的缺点:
常驻内存,增加内存使用量。
使用不当会很容易造成内存泄露。
标记清除法
当变量进入执行环境时标记为“进入环境”,当变量离开执行环境时则被标记为“离开环境”,被标记为“进入环境”的变量是不能被回收的,因为它们正在被使用,而标记为“离开环境”的变量则可以被回收。「闭包中返回的函数就是进入环境中的,并未离开环境」
引用计数法
统计引用类型变量声明后被引用的次数,当次数为0时,该变量将被回收。但是引用计数的算法有一个缺点:循环引用。
在现代浏览器中,JS使用的垃圾回收机制是标记清除法,所以我们无需再担心循环引用带来的问题。
七种数据类型:Number、String、Boolean、Null、undefined、symbol、object「常用的有Array、function、Date」
查看变量数据类型:
用typeof:typeof x 「typeof A => Number」
用instanceof:x instanceof type 「(A instanceof Number) => true」object instanceof constructor:instanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。
用变量的constructor属性:x.constructor === Number「null和undefined没有constructor属性」
基本数据类型:直接将值保存在栈内存中
引用数据类型:将地址保存在栈内存中,指向堆内存的空间
死锁是指多个进程在运行过程中因争夺资源而造成的一种僵局,若无外力作用则进程都无法向前推进
原因:不可剥夺资源的竞争、进程间推进顺序非法
四个必要条件「互斥、请保、不剥、环路」
互斥条件「一段时间内资源仅供一个进程所使用」
请求和保持条件「进程一边请求资源一边保持已有资源」
不剥夺条件「进程已经获得的资源自能由自己释放,未使用完之前不能被剥夺」
环路等待条件「存在一个进程-资源的环形链」
管道:上一阶段的输出作为下一阶段的输入「匿名管道/命名管道」
消息队列:按照独立的信息体进行消息发送
共享内存+信号量:申请一块虚拟内存空间,不同进程通过虚拟地址映射到物理地址进行访问,通过信号量解决冲突问题。
套接字
先通过逻辑地址和页面大小得到页号和页内偏移
逻辑地址/页面大小=页号
逻辑地址 mod 页面大小=页内偏移
通过页号查找页表得到对应的物理区块
物理地址=物理区块x页大小+页内偏移
当HTTP发起一个消息请求时,应用层、传输层、网络层和链路层的相关协议依次对该消息请求附加对应的首部,这个首部标明了协议应该如何读取数据,最终在链路层生成以太网数据包,以太网数据包通过物理介质传输到目的主机,目的主机接收到以太网数据包以后,再一层一层采用对应的协议进行拆包,最后把应用层数据交给应用程序处理。简单来说,就是"发送请求时,封包,接收数据时,拆包。"
数据段:TCP 数据流中的信息;
数据包:IP 和 UDP 等网络层以上的分层中包的单位;
数据帧:数据链路层中包的单位;
而可靠的传输服务是指,能够把数据准确可靠地传给对方。
3次握手和4次挥手——建立连接
校验和——防止数据损坏
应答与超时重传机制——防止丢包
序列号——保证顺序接收数据
滑动窗口——通过发送端和接收端流量进行控制
拥塞控制——慢启动算法,拥塞窗口
TCP 利用滑动窗口实现流量控制。流量控制是为了控制发送方发送速率,保证接收方来得及接收。
TCP会话的双方都各自维护一个发送窗口和一个接收窗口。接收窗口大小取决于应用、系统、硬件的限制。发送窗口则取决于对端通告的接收窗口。接收方发送的确认报文中的window字段可以用来控制发送方窗口大小,从而影响发送方的发送速率。将接收方的确认报文window字段设置为 0,则发送方不能发送数据。当发送方获取window=0的报文后需要过一段时间再发送一个试探报文来获取当前接收窗口的空余大小,再开始发送报文。
慢开始
把拥塞窗口 cwnd 设置为一个最大报文段MSS的数值。而在每收到一个对新的报文段的确认后,把拥塞窗口增加至多一个MSS的数值。每经过一个传输轮次,拥塞窗口 cwnd 就加倍。 为了防止拥塞窗口cwnd增长过大引起网络拥塞,还需要设置一个慢开始门限ssthresh状态变量。
当 cwnd < ssthresh 时,使用慢开始算法。「cwnd指数增加」
当 cwnd > ssthresh 时,停止使用慢开始算法而改用拥塞避免算法。「cwnd线性上升」
当 cwnd = ssthresh 时,既可使用慢开始算法,也可使用拥塞控制避免算法。
拥塞避免
让拥塞窗口cwnd缓慢地增大,每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1,而不是加倍。这样拥塞窗口cwnd按线性规律缓慢增长。
无论在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(其根据就是没有收到确认),就要把慢开始门限ssthresh设置为出现拥塞时的发送 方窗口值的一半(但不能小于2)。然后把拥塞窗口cwnd重新设置为1,执行慢开始算法。这样做的目的就是要迅速减少主机发送到网络中的分组数,使得发生 拥塞的路由器有足够时间把队列中积压的分组处理完毕。
快重传
有时个别报文段会在网络中丢失,但实际上网络并未发生拥塞。如果发送方迟迟收不到确认,就会产生超时,就会误认为网络发生了拥塞。这就导致发送方错误地启动慢开始,把拥塞窗口cwnd又设置为1,因而降低了传输效率。
快重传算法可以避免这个问题。快重传算法首先要求接收方每收到一个失序的报文段后就立即发出重复确认,使发送方及早知道有报文段没有到达对方。
发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段,而不必继续等待重传计时器到期。由于发送方尽早重传未被确认的报文段,因此采用快重传后可以使整个网络吞吐量提高约20%。「为什么是三次:两次duplicated ACK时很可能是乱序造成的!三次duplicated ACK时很可能是丢包造成的!四次duplicated ACK更更更可能是丢包造成的,但是这样的响应策略太慢。丢包肯定会造成三次duplicated ACK!综上选择收到三个重复确认时窗口减半效果最好,这是实践经验。」
快恢复
当发送方连续收到三个重复确认,就会把门限ssthresh设置为当前窗口的一半,接着把cwnd值设置为慢开始门限ssthresh减半后的数值,然后开始执行拥塞避免算法,使拥塞窗口缓慢地线性增大。
在采用快恢复算法时,慢开始算法只是在TCP连接建立时和网络出现超时时才使用。 采用这样的拥塞控制方法使得TCP的性能有明显的改进。
数组是开辟连续的内存空间进行存储,优点是可以随机存取,缺点是插入或者删除元素的开销较大
链表所使用的内存空间不一定是连续的,它通过节点来保存值,还有一个指针空间指向下一个存储值的空间,优点是插入和删除链表节点的开销不大,但是无法做到随机存取
「JS里的数组本质上是对象,所以可以存任意类型的数据,相比与对象,数组的键只能是数字」
电脑垃圾清理大师:处理碎片垃圾
内存碎片的产生和合并,数组上如果开辟连续空间可能剩余的空间大小不够每次有办法一次性申请较大空间。如果是链表可能就可以满足每次申请小空间的需求,但是容易把连续的内存空间进行分割,容易导致申请数组的时候没有整块的大空间
阿里的一面面试官是小组ld,二面面试官是部门ld,三面就是hr面了,但是据说阿里的hr还是比较有话语权的,所以hr面也要用心准备,不可掉以轻心。总体来说钉钉的面试侧重点还是在项目上,问的问题比较开放,也会考虑个人的性格和人品。不太考察八股,但是我们可以在回答开放题的过程中有意识地加入一些背过的八股内容来充实我们的答案。注意前端考察的算法有可能也会考虑的JS的语法特性,或者实现某些CSS效果。
因为原生的DOM信息量太大了,一个简单的DIV里面就包含了大量的数据,所以渲染和操作起来对于性能的开销较大。用虚拟DOM就是用VNode对其进行抽象,一方面配合diff算法检测出最小的需要改变的部分节点,实现局部刷新,优化性能。另一方面抽象了DOM可以实现跨平台,除了PC端还有移动端这些其他设备。
http1.1/1.0:长连接和短连接
HTTP1.0默认短连接,「一http请求一TCP」浏览器和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接。
HTTP1.1默认为长连接,复用TCP连接「多http请求一TCP」。多个HTTP请求可以复用同一个TCP连接,这就节省了TCP连接建立和断开的消耗。
要使用长连接,客户端和服务器的HTTP首部的Connection都要设置为keep-alive,才能支持长连接。不再发送时客户端带上Connection: close首部发送给服务器,关闭连接。「Connection: keep-alive / close」
http2.0/1.1的显著不同点
1、二进制格式传输数据:
HTTP1.1 文本格式;HTTP2.0二进制格式,解析高效。
2、多路复用
HTTP/1.0 一次请求-响应,建立一个连接,用完关闭;每一个请求都要建立一个连接;
HTTP/1.1 Pipeling解决方式为,若干个请求排队串行化单线程处理,后面的请求等待前面请求的返回才能获得执行机会,一旦有某请求超时等,后续请求只能被阻塞,毫无办法,也就是人们常说的线头阻塞;
HTTP/2多个请求可同时在一个连接上并行执行,一个request对应一个id。某个请求任务耗时严重,不会影响到其它连接的正常执行;
3、头部压缩 ,HTTP1.1的header带有大量信息,而且每次都要重复发送;HTTP2.0 把header从数据中分离,并封装成头帧和数据帧,使用特定算法压缩头帧,有效减少头信息大小。并且在C/S端都进行了键值对缓存,不需要发送和上次相同的数据。C只需发送和上一次不同的差异头数据给B,减少了数据冗余。
4、服务端主动推送 :HTTP2.0允许服务器向客户端推送资源,无需客户端发送请求到服务器获取
输入url,先处理DNS,本地缓存、hosts、查询DNS服务器、根-顶级-权威DNS服务器,然后通过tcp三次握手建立连接,开始传输http请求和响应,浏览器获得到服务器传输的页面后开始解析,解析HTML、CSS获得DOM树和Style树,并将它们合并成render树,对render树进行布局,然后渲染render树,最后浏览器把解析好的结果发送到GPU进行渲染显示到显示器上。
变题:style标签写在body后与body前有什么区别「前好后不好」
1、写在body标签前利于浏览器逐步渲染「一般是先加载样式再加载结构」:
resources downloading->CSSOM+DOM->RenderTree(composite)->Layout->paint
2、写在body标签后:
由于浏览器以逐行方式对html文档进行解析;
当解析到写在尾部的样式表(外联或写在style标签)会导致浏览器停止之前的渲染,等待加载且解析样式表完成之后重新渲染;
在windows的IE下可能会出现FOUC现象(结构解析完但样式还没有解析完);
原理:对于不同的加载文件类型创建不同的节点「css-link标签、JS-script标签」,然后添加各自的属性「css-href/rel/type、JS-href/type」,最后扔到head标签里面。
// 动态加载css文件var head = document.getElementsByTagName('head')[0];var link = document.createElement('link');link.href = path;link.rel = 'stylesheet'; link.type = 'text/css';head.appendChild(link); // 动态加载JS文件var head = document.getElementsByTagName('head')[0];var script = document.createElement('script');script.href = path;script.type = 'text/javascript';head.appendChild(script);创建过程
1、创建一个小黄人xhr对象
let xhr = new XMLHttpRequest();
2、设置小黄人的各项配置
xhr.open(‘get’, ‘www.baidu.com’, true);
3、post设置请求头中资源的数据类型:
xhr.setRequsetHeader(‘Content-type’: ‘application/x-www-form-uncoded / json’) 。get方法在send(data)中的data为查询字符串,post方法为JSON.stringify()
4、发送HTTP请求:
get:xhr.send()
post: xhr.send(JSON.stringify(obj))
5、监听相应数据:
xhr.onload = function(){console.log(responseText)};
xhr.onerror = function(){};
判断任务是否正确执行:
查看xhr.status中的http状态码。
hr面内容就是这里啦。
因为字节面了两个部门,国际化电商一面就挂了,所以就把两个部门放在一起喽。一面挂的原因:当时觉得钉钉比较稳了,然后之前因为准备实习面试花了太多时间,实验室项目和课程大作业的进度都有些滞后,所以没有花太多时间准备字节的面经「所以大家最好寒假就复习好呀!!!」,并且当时红宝书也没看多少,很多底层知识不太了解,一问就寄了。「还是太菜」
1、Canvas是使用javaScript程序绘制动态生成的,SVG是使用xml文档描述来绘图。从这点来看:SVG更适合用来做动态交互,而且SVG绘图更容易编辑,只需要增加或移除相应的元素就可以了。
2、SVG是基于矢量的,所以它能够很好的处理图形大小的变大。canvas是基于位图的图像,他不能改变大小,只能缩放显示
3、canvas支持的颜色比SVG多
通过一个函数判断两个变量是否相等isEq()
招商银行面试在半小时内,每次面试两个面试官。
删除链表的倒数第K个节点
输出100以内的质数「使用已经获得的质数,上限为当前数的开根号」
输出100以内的质数「使用已经获得的质数,上限为当前数的开根号」
因为面腾讯的时间已经比较靠后了,也有想去的公司的offer了,所以面了一次后就不想面了。「本人项目设计echarts内容,所以被问得较多」
求两个数组的交集