目录
7. 一个url从访问到浏览器绘制的过程?再往深说一下,涉及到缓存相关的,怎么处理?
8. script标签有defer和async这两个标签是什么意思?
7. 一个url从访问到浏览器绘制的过程?再往深说一下,涉及到缓存相关的,怎么处理?
8. script标签有defer和async这两个标签是什么意思?
项目经验:
架构是如何设计的?
数据埋点是如何实现的,如何封装?
表现: 回答的不太好啊!!
面试内容:
1. css写一个三角形,写一个梯形?
答: 这个是利用的div的border是一个梯形的原理,如果不给div设置宽度和高度,只设置border , 自border会向内延申,就是一个三角形,然后只保留一边,其他的颜色设置为透明,就是一个三角形了?
如果是梯形,只要加上宽度和高度,就可以写一个梯形了。
2. js的宏任务和微任务的执行顺序?输出下面的值的顺序?
console.log('start')
setTimeout(function() {
Promise.resolve().then(function() {
console.log('promise3')
}).then(function() {
console.log('promise4')
})
console.log('setTimeout1')
}, 0)
setTimeout(function() {
console.log('setTimeout2');
}, 0)
Promise.resolve().then(function() {
console.log('promise1')
}).then(function() {
console.log('promise2')
})
console.log('end');
结果: start end , promise1, promise2, setTimeout1 ,promise3, promise4, setTimeout2
原因: 先执行同步任务,输出start, end , 再执行异步任务, promise.resolve被立即调用了,所以,是promise1, promise2, 再执行setTimeout ,输出setTimeout1, 其中的Promise是setTimeout的微任务,所以继续执行promise3, promise4, 最后执行setTimeout2
3. new 的过程是怎么样?
创建一个空对象,将它的引用赋给 this,继承函数的原型。
通过 this 将属性和方法添加至这个对象
最后返回 this 指向的新对象,也就是实例(如果没有手动返回其他的对象)
4. 数组的常用方法,map和filter手写一下实现?
function filte(arr, callback) {
if (!arr || !callback) {
return;
}
let narr = [];
for (let i = 0; i < arr.length; i++) {
if (callback(i)) {
narr.push(arr[i]);
}
}
console.log(narr);
}
var arr = [1, 2, 3, 4];
filte(arr, item => item < 3);
function map(arr) {
if (!arr) {
return
}
let newarr = [];
for (let i = 0; i < arr.length; i++) {
console.log(typeof arr[i]);
if (typeof arr[i] === "number") {
newarr.push(Math.sqrt(arr[i]))
}
}
return newarr;
}
let arr1 = [4, 9, 16, 25];
console.log(map(arr1));
5. call 和apply ,bind 的区别?
三者都能改变对象的this指向, call和apply都是直接对函数的调用,bind是返回的是一个函数,因此后面还需要()来进行调用才可以。
call的和apply的第一个参数都是对象,apply后面传入的是数组, call后面传入的是一一对应的参数。
6. 箭头函数了解吗?
不能用作构造函数?
7. 一个url从访问到浏览器绘制的过程?再往深说一下,涉及到缓存相关的,怎么处理?
从输入URL到渲染出整个页面的过程包括三个部分:
1、DNS解析URL的过程
2、浏览器发送请求与服务器交互的过程
3、浏览器对接收到的html页面渲染的过程
一、DNS解析URL的过程
DNS解析的过程就是寻找哪个服务器上有请求的资源。因为ip地址不容易记忆,一般会使用URL域名(如www.baidu.com)作为网址。DNS解析就是将域名翻译成IP地址的过程。
具体过程:
1)浏览器缓存:浏览器会按照一定的频率 缓存DNS记录
2)操作系统缓存:如果浏览器缓存中找不到需要的DNS记录,就会取操作系统中找
3)路由缓存:路由器也有DNS缓存
4)ISP的DNS服务器:ISP有专门的DNS服务器应对DNS查询请求
5)根服务器:ISP的DNS服务器找不到之后,就要向根服务器发出请求,进行递归查询
二、浏览器与服务器交互过程
1)首先浏览器利用tcp协议通过三次握手与服务器建立连接
http请求包括header和body。header中包括请求的方式(get和post)、请求的协议 (http、https、ftp)、请求的地址ip、缓存cookie。body中有请求的内容。
2)浏览器根据解析到的IP地址和端口号发起http的get请求.
3)服务器接收到http请求之后,开始搜索html页面,并使用http返回响应报文
4)若状态码为200显示响应成功,浏览器接收到返回的html页面之后,开始进行页面的渲染
三、浏览器页面渲染过程
1)浏览器根据深度遍历的方式把html节点遍历成dom 树
2)将css解析成CSS DOM树
3)将dom树和CSS DOM树构造成render树
4)JS根据得到的render树 计算所有节点在屏幕中的位置,进行布局(回流)
5)遍历render树并调用硬件API绘制所有节点(重绘)
补充: 构造render渲染树的过程
- 从DOM树的根节点开始遍历每个可见的节点。
- 对于每个可见的节点,找到CSS树中的对应的规则,并且应用他们。
- 根据每个可见的节点及其对应的样式,组合生成渲染树。
8. script标签有defer和async这两个标签是什么意思?
现在大家习惯于在页面中引用各种的第三方脚本,如果第三方服务商出现了一些小问题,比如延迟之类的,就会使得页面白屏。
好在script
提供了两种方式来解决上述问题,async
和defer
,这两个属性使得script
都不会阻塞DOM
的渲染。
但既然会存在两个属性,那么就说明,这两个属性之间肯定是有差异的。
defer:
- 如果
script
标签设置了该属性,则浏览器会异步的下载该文件并且不会影响到后续DOM
的渲染; - 如果有多个设置了
defer
的script
标签存在,则会按照顺序执行所有的script
; defer
脚本会在文档渲染完毕后,DOMContentLoaded
事件调用前执行
async:
async
的设置,会使得script
脚本异步的加载并在允许的情况下执行async
的执行,并不会按着script
在页面中的顺序来执行,而是谁先加载完谁执行。
9. vue和react有什么区别?
10. vue是如何实现数据绑定?
11. vue用的什么设计模式?
Vue使用的mvvm的设计模式和观察者模式;
我们把核心的设计模式分为Observer,Dep,Watcher,Observer被称为观察者,观察着我们的数据,Dep为数据分配中心,收集数据和通知数据更新,Watcher作为订阅者,收集每个被订阅的对象,就比如我们vue中常见的{{value}},
这就是一个订阅对象,每当发现一个需要被订阅的对象,就往对应Dep中新增一个Watcher类,这就是收集依赖的过程,而当value的值发生改变时,观察者就会告诉Dep,让Dep通知所有的Watcher进行数据更新,这就是所谓的数据响应式。
12. 手写一个单例模式?