ajax 和 axios 、fetch 的区别

1. Ajax指的是什么?

2. Ajax 的缺点?

3. Axios 的特征

答:

  1. 传统 Ajax 指的是 XMLHttpRequest (XHR), 核心使用 XMLHttpRequest 对象, 多个请求之间如果有先后关系的话, 会出现回调地狱

JQuery Ajax 是对原生 XHR 的封装, 除此之外增添了对 JSONP 的支持.

2. Ajax 的缺点如下:

3. axios 的特征

axios 是基于 Promis 用于浏览器和 nodejs 的HTTP 客户端, 本质上也是对原生 XHR 的封装, 只不过它是 Promis 的实现版本, 符合最新的 ES 规范

4. fetch

见 fetch 笔记

5. fetch 的 polyfill

Polyfill 是一块代码(通常是 Web 上的 JavaScript),用来为旧浏览器提供它没有原生支持的较新的功能。

比如说 polyfill 可以让 IE7 使用 Silverlight 插件来模拟 HTML Canvas 元素的功能,或模拟 CSS 实现 rem 单位的支持,或text-shadow,或其他任何你想要的功能。

补充

补充:原生 Ajax 指 XMLHttpRequest;axios 是基于 Promise 封装 XHR 的客户端库;fetch 是浏览器原生提供的基于 Promise 的网络请求 API。

补充对比:

维度XMLHttpRequestaxiosfetch
时代浏览器原生(老)第三方库浏览器原生(新)
返回事件 / callbackPromisePromise
默认请求头无自动 JSON无(需手动设)
拦截器无有(请求/响应)无(需自己包)
取消请求xhr.abort()AbortController / CancelTokenAbortController
错误处理需手动判断 status抛 4xx/5xx 异常只在网络失败 reject
兼容性IE7+现代浏览器 + Node现代浏览器(IE 不支持)

使用建议:

  • 简单请求:fetch + AbortController,体积小、原生支持。
  • 复杂项目:axios 统一拦截、配置 baseURL、超时、Token 刷新。
  • 老浏览器兼容:仍需 axios 或自行封装 XHR。

fetch 示例:

const ctrl = new AbortController();
setTimeout(() => ctrl.abort(), 5000);
fetch('/api/data', { signal: ctrl.signal })
  .then(r => r.ok ? r.json() : Promise.reject(r))
  .then(data => console.log(data))
  .catch(err => console.error(err));

补充:fetch 不会因 HTTP 4xx/5xx 自动 reject,必须手动 throw 或 reject,常被初学者忽略。