1. 请说明 Ajax Fetch Axios 三者的区别
三者都用于网络请求,但是不同维度
- Ajax(Asynchronous Javascript and XML):一种技术统称
- Fetch:一个原生API (浏览器原生 API,用于网络请求; 和 XMLHttpRequest 一个级别; Fetch 语法更加简洁、易用,支持 Promise)
- Axios:一个 第三方库 最常用的网络请求 lib(随着 Vue 火爆起来);内部可用 XMLHttpRequest 和 Fetch 来实现
用 XMLHttpRequest 实现 Ajax
/**
* @description: 用 XMLHttpRequest 实现 Ajax
* @param {*} url 接口地址
* @param {*} successFn 回调函数
* @return {*}
*/
function ajax(url, successFn) {
const xhr = new XMLHttpRequest();
xhr.open('GET', url, false);
xhr.onreadystatechange = function () {
// 这里的函数异步执行
if (xhr.readyState == 4) {
if (xhr.status == 200) {
successFn(xhr.responseText);
}
}
};
xhr.send(null);
}
2. 节流和防抖(两者有什么区别,分别用于什么场景?)
- 防抖,防止抖动 “你先抖动着,啥时候停了,再执行下一步”
- 例如,一个搜索输入框,等输入停止之后,再触发搜索
/**
* @description: 防抖函数
* @param {*} fn 回调函数
* @param {*} delay 延迟时间ms
* @return {*}
*/
function debounce(fn, delay = 200) {
let timer = 0;
return function () {
if (timer) clearTimeout(timer);
timer = setTimeout(() => {
fn.apply(this, arguments); // 透传 this 和参数
timer = 0;
}, delay);
};
}
- 节流,节省交互沟通。流,不一定指流量。
- “别急,一个一个来,按时间节奏来,插队者无效”
- 例如,drag 或 scroll 期间触发某个回调,要设置一个时间间隔
/**
* @description: 节流函数
* @param {*} fn 回调函数
* @param {*} delay 延迟时间ms
* @return {*}
*/
function throttle(fn, delay = 200) {
let timer = 0;
return function () {
if (timer) return;
timer = setTimeout(() => {
fn.apply(this, arguments); // 透传 this 和参数
timer = 0;
}, delay);
};
}
3. 箭头函数
箭头函数有什么缺点?
- 没有 arguments
- 无法通过 apply call bind 改变 this
- 某些箭头函数代码难以阅读
什么时候不能使用箭头函数?
4. 请描述TCP三次握手 四次挥手
建立 TCP 连接
- 先建立连接(确保双方都有收发消息的能力)
- 再传输内容(如发送给一个 get 请求)
- 网络连接是 TCP 协议,传输内容是 HTTP 协议
三次握手 -建立连接
- Client 发包,Server 接收。Server:有 Client 要找我
- Server 发包,Client 接收。Client:Server 已经收到信息了
- Client 发包,Server 接收。Server:Client 要准备发送了
四次挥手-关闭连接
- Client 发包,Server 接收。Server:Client 已请求结束
- Server 发包,Client 接收。Client:Server已收到,我等待它关闭
- Server 发包,Client 接收。Client:Server 此时可以关闭连接了
- Client 发包,Server 接收。Server:可以关闭了(然后关闭连接)
5. offsetHeight scrollHeight clientHeight 有什么区别
计算规则
- offsetHeight offsetWidth : border + padding + content
- clientHeight clientwidth : padding + content
- scrollHeight scrollWidth : padding + 实际内容尺寸
6. HTMLCollection 和 NodeList 区别
Node 和 Element
- DOM 是一棵树,所有节点都是 Node
- Node 是 Element 的基类
- Element 是其他 HTML 元素的基类,如 HTMLDivElement
HTMLCollection 是 Element 的集合
NodeList 是 Node 集合
7. JS 严格模式有什么特点
JS 严格模式细节要求很多,只掌握重点即可
- 全局变量必须先声明
- 禁止 this 指向 window
- 禁止使用 with
- 函数参数不能重名
- 创建 eval 作用域
8. HTTP 跨域请求时为何发送 options 请求
跨域请求
- 浏览器同源策略
- 同源策略一般限制 Ajax 网络请求,不能跨域请求 server
- 不会限制 link img script iframe等标签加载第三方资源
服务端解决跨域问题
答案: - options 请求,是跨域请求之前的预检查
- 浏览器自行发起的,无需我们干预
- 不会影响实际的功能