这些个 axios 工具函数,你都掌握了吗

news2024/9/23 5:17:37

前言

周末过得真快,看个源码时间就过去了👀。

在上周看做项目的时候看到了项目里封装的 axios,对其封装的原理没有弄清楚,于是周末的时候便抽了点空闲时间来看了看 axios 的源码,将其研究研究。

源码阅读

这里就不单独介绍 axios 了,对于 axios 想必大家都有过了解。咱们直接进入源码阅读的主题。我们今天主要看的是源码中的utils.js文件,里面包含了很多工具函数。

这是截取的其中一部分,粗略看下来大概有四五十个工具函数,接下来开始分享其中一些这里面我平时不怎么见到过或者用到过的工具函数,来学习一下。

kindOf

const {toString} = Object.prototype;
const {getPrototypeOf} = Object;
const kindOf = (cache => thing => {const str = toString.call(thing);return cache[str] || (cache[str] = str.slice(8, -1).toLowerCase());
})(Object.create(null)); 

kindOf 主要作用是获取对象的类型。有点类似于 typeoftypeof 是判断对象的类型的作用。

isBuffer

function isBuffer(val) {return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor) && isFunction(val.constructor.isBuffer) && val.constructor.isBuffer(val);
} 

Buffer 中文意思是缓冲区。isBuffer 是用来判断 buffer 类的,它是一个类似于 Array 的对象。

这里先判断 val 是否为 null 或者 undefined,再判断 val 的构造函数是否为 null 或者 undefined,最后再回调 isBuffer 函数对 val 的构造函数进行判断。

isArrayBufferView

function isArrayBufferView(val) {let result;if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) {result = ArrayBuffer.isView(val);} else {result = (val) && (val.buffer) && (isArrayBuffer(val.buffer));}return result;
} 

isPlainObject

const isPlainObject = (val) => {if (kindOf(val) !== 'object') {return false;}const prototype = getPrototypeOf(val);return (prototype === null || prototype === Object.prototype || Object.getPrototypeOf(prototype) === null) && !(Symbol.toStringTag in val) && !(Symbol.iterator in val);
}; 

isPlainObject 是用来判断纯对象的,纯对象可以理解为纯粹的对象。

isFormData

const isFormData = (thing) => {const pattern = '[object FormData]';return thing && ((typeof FormData === 'function' && thing instanceof FormData) ||toString.call(thing) === pattern ||(isFunction(thing.toString) && thing.toString() === pattern));
} 

isFormData 是判断传入的参数 thing 是否为 isFormData

trim

function trim(str) {return str.trim ? str.trim() : str.replace(/^\s+|\s+$/g, '');
} 

这个方法在项目中有用到过,但是用的频率并不是很高,是用来去除字符串两侧的空白字符的。

findKey

function findKey(obj, key) {key = key.toLowerCase();const keys = Object.keys(obj);let i = keys.length;let _key;while (i-- > 0) {_key = keys[i];if (key === _key.toLowerCase()) {return _key;}}return null;
} 

其实从字面意思也大概能猜到它的作用,它是用来找到对象的 Key 值的,也可以说是键值吧。

merge

function merge(/* obj1, obj2, obj3, ... */) {const {caseless} = isContextDefined(this) && this || {};const result = {};const assignValue = (val, key) => {const targetKey = caseless && findKey(result, key) || key;if (isPlainObject(result[targetKey]) && isPlainObject(val)) {result[targetKey] = merge(result[targetKey], val);} else if (isPlainObject(val)) {result[targetKey] = merge({}, val);} else if (isArray(val)) {result[targetKey] = val.slice();} else {result[targetKey] = val;}}for (let i = 0, l = arguments.length; i < l; i++) {arguments[i] && forEach(arguments[i], assignValue);}return result;
} 

从参数里可以发现,它传入了很多对象参数,再结合 merge 合并的意思,不难猜出这个函数是用来合并对象的。在合并代码的时候,里面就能看到 merge

stripBOM

function stripBOM(content) {if (content.charCodeAt(0) === 0xFEFF) {content = content.slice(1);}return content;
} 

这个函数是用来去除编码中的 BOM 的,这个确实没怎么见过或者听说过。

endsWith

const endsWith = (str, searchString, position) => {str = String(str);if (position === undefined || position > str.length) {position = str.length;}position -= searchString.length;const lastIndex = str.indexOf(searchString, position);return lastIndex !== -1 && lastIndex === position;
} 

从传入参数 str,searchString, position 来判断,这个函数应该和判断字符串位置有关。然后结合 lastIndex === position 可以看出,它的作用是判断字符串(str)是否以指定的字符串(searchString)结尾(position)。

toArray

const toArray = (thing) => {if (!thing) return null;if (isArray(thing)) return thing;let i = thing.length;if (!isNumber(i)) return null;const arr = new Array(i);while (i-- > 0) {arr[i] = thing[i];}return arr;
} 

这个函数可以将类数组转换为数组,里面的逻辑实现不难理解,相对比较简单。

toCamelCase

const toCamelCase = str => {return str.toLowerCase().replace(/[_-\s]([a-z\d])(\w*)/g,function replacer(m, p1, p2) {return p1.toUpperCase() + p2;});
}; 

都知道驼峰命名法吧,这个函数可以将字符串转换为驼峰命名。类似于把 abcdef 的字符转换成 abcDef

总结

仅仅看一遍是远远不够的,这源码里覆盖了太多工具函数,这里我阅读了其中十几种。通过简单阅读了一遍 axios 的源码,让我对 axios 有了进一步认识,关于剩下的源码部分,下周会继续抽时间完成阅读学习。总之,我认为 axios 源码可以多看几遍,每一遍或许都会有不同的认识。

最后

最近还整理一份JavaScript与ES的笔记,一共25个重要的知识点,对每个知识点都进行了讲解和分析。能帮你快速掌握JavaScript与ES的相关知识,提升工作效率。



有需要的小伙伴,可以点击下方卡片领取,无偿分享

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/383228.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

实战:一天开发一款内置游戏直播的国产版Discord应用【附源码】

游戏直播是Discord产品的核心功能之一&#xff0c;本教程教大家如何1天内开发一款内置游戏直播的国产版Discord应用&#xff0c;用户不仅可以通过IM聊天&#xff0c;也可以进行语聊&#xff0c;看游戏直播&#xff0c;甚至自己进行游戏直播&#xff0c;无任何实时音视频底层技术…

数据增广真有那么神奇吗?

作者&#xff1a;皮皮雷 来源&#xff1a;投稿 编辑&#xff1a;学姐 论文题目 How Effective is Task-Agnostic Data Augmentation for Pretrained Transformers? 论文作者 S. Longpre, Y. Wang, and C. DuBois 论文发表于 2020 EMNLP findings 摘要 任务无关的数据增广…

chatgpt功能展示

Chatgpt 不知道大家刷抖音的时候是否刷到了人工智能要取代人类的一些短视频&#xff0c;他们所提到的主角就是一个AGI模型——chatgpt&#xff0c;资本对其的追求程度可以用火爆&#x1f525;来形容了吧&#xff0c;先给大家讲一下chatgpt吧&#xff0c;如果没兴趣看我扯犊子可…

网络安全入门学习:社会工程学

在电影《我是谁&#xff1a;没有绝对安全的系统》中&#xff0c;主角本杰明充分利用自己高超的黑客技术&#xff0c;非法入侵国际安全系统&#xff0c;并在最后逃之夭夭。在电影中&#xff0c;有一句经典的台词&#xff1a; 所有黑客手段中最有效的、最伟大的幻想艺术——社会…

windows10安装ubantu双系统

windows10安装ubantu双系统 文章目录windows10安装ubantu双系统一、安装前准备1.前期说明2.制作U盘启动器3.设置硬盘分区相关4.设置给ubantu系统的硬盘大小&#xff0c;设置为未分配&#xff08;删除卷&#xff09;二、进行安装1.设置bios相关2.进入bios启动界面选择U盘安装3.进…

快速入门 Python 数据分析实用指南

Python 现如今已成为数据分析和数据科学使用上的标准语言和标准平台之一。那么作为一个新手小白&#xff0c;该如何快速入门 Python 数据分析呢&#xff1f; 下面根据数据分析的一般工作流程&#xff0c;梳理了相关知识技能以及学习指南。 数据分析一般工作流程如下&#xff…

北京移动CM311-5s-ZG_GK6323V100C_2+8_免拆一键卡刷固件包

北京移动CM311-5s-ZG_GK6323V100C_28_免拆一键卡刷固件包 特点&#xff1a; 1、适用于对应型号的电视盒子刷机&#xff1b; 2、开放原厂固件屏蔽的市场安装和u盘安装apk&#xff1b; 3、修改dns&#xff0c;三网通用&#xff1b; 4、大量精简内置的没用的软件&#xff0c;…

【蓝桥杯试题】递归实现排列型枚举

&#x1f483;&#x1f3fc; 本人简介&#xff1a;男 &#x1f476;&#x1f3fc; 年龄&#xff1a;18 &#x1f91e; 作者&#xff1a;那就叫我亮亮叭 &#x1f4d5; 专栏&#xff1a;蓝桥杯试题 文章目录1. 题目描述2. 代码展示法一&#xff1a;dfs法二&#xff1a;next_perm…

Android开发如何自定义View实现圆弧进度效果

在Android开发中&#xff0c;通过自定义View实现自己想要的效果是作为android开发程序员的一项必备技能&#xff0c;自定义View对于android开发来说也是比较难的一项技术。 涉及到的知识Canvas&#xff08;画布&#xff09;,Paint&#xff08;画笔&#xff09;&#xff0c;自定…

​35岁+的年龄不仅能进入大厂,还能年收入百万+,原来吃透这些才是关键

本人985院校毕业&#xff0c;华为工作10年&#xff0c;创业3年&#xff0c;现在另一大厂&#xff0c;年收入百万 华为期间岗位从测试工程师&#xff0c;到测试经理&#xff0c;再到项目经理&#xff0c;现35岁的年龄进入另一个大厂。这期间面试过上千人&#xff0c;也管理过几…

Qt QMessageBox详解

文章目录一.QMessageBox介绍枚举属性函数二.QMessageBox的用法1.导入QMessage库2.弹窗提示3.提供选项的弹窗提示4.作为提示&#xff0c;报警&#xff0c;报错提示窗口一.QMessageBox介绍 文本消息显示框(message box)向用户发出情况警报信息并进一步解释警报或向用户提问&…

Git学习:IDEA项目上传到码云

5分钟学习创建项目上传到git服务器 文章目录前言一、gitee创建项目&#xff1f;1、gitee创建项目2、IDEA在本地创建项目3、找到git下载好git程序4、 找到git安装目录 bin目录下的 git.exe 文件5、进行操作&#xff08;提交代码到Gitee&#xff09;6、 上传成功&#xff08;刷新…

vue 解决问题:Webpack安装不成功,webpack -v无法正常显示版本号

目录 一、解决问题&#xff1a;Webpack安装不成功&#xff0c;webpack -v无法正常显示版本号 二、解决问题&#xff1a; ERROR Error: Cannot find module webpack-log 三、 解决报错&#xff1a;error:03000086:digital envelope routines::initialization error 四、解决…

Java设计模式笔记——七大设计原则

系列文章目录 第一章 Java 设计模式之七大设计原则 文章目录系列文章目录前言一、单一职责原则1.案例分析2.改进二、开闭原则1.案例分析2.改进三、里氏替换原则1.案例分析2.改进四、依赖倒转原则五、接口隔离原则1.案例分析2.改进六、合成复用原则1.案例分析2.改进七、迪米特原…

PythonWeb Django PostgreSQL创建Web项目(三)

了解Django框架下如何配置数据库链接与创建模型和应用 使用Django创建web项目&#xff0c;首先需要了解生成的项目文件结构&#xff0c;以及对应文件功能用途方可开始web项目页面创建&#xff0c;下方先介绍文件功能&#xff0c;之后再配置数据库连接以及管理创建模型与应用&a…

招生咨询|浙江大学MPA项目2023年招生问答与通知

问&#xff1a;报考浙江大学MPA的基本流程是怎么样的&#xff1f; 答&#xff1a;第一阶段为网上报名与确认。MPA考生须参加全国管理类联考&#xff0c;网上报名时间一般为10月初开始、10月下旬截止&#xff0c;错过网上报名时间后不能补报。确认时间一般为11月上旬&#xff0c…

如何提高软件测试效率 降低开发成本?

1、单元测试以开发人员为主 测试分工需根据测试人员的特点进行&#xff0c;而单元测试应以开发人员为主&#xff0c;以保障每个单元能够完成设计的功能。集成测试也可以以开发人员为主进行。当软件体系结构完成后&#xff0c;独立测试人员应尽量选择比较熟悉相关领域的人员。​…

三、Spring的入门程序

第一个Spring程序 创建新的空工程spring6 设置JDK版本17&#xff0c;编译器版本17 设置IDEA的Maven&#xff1a;关联自己的maven 在空的工程spring6中创建第一个maven模块&#xff1a;spring6-001-first 在pom.xml添加spring context依赖和junit依赖&#xff0c; <?x…

基于轻量级YOLO开发构建中国象棋目标检测识别分析系统

关于棋类相关的项目在我之前的博文里面都有做过&#xff0c;如下&#xff1a;《yolov5s融合SPD-Conv用于提升小目标和低分辨率图像检测性能实践五子棋检测识别》《YOLOV5融合SE注意力机制和SwinTransformer模块开发实践的中国象棋检测识别分析系统》《基于yolov5s实践国际象棋目…

第七章.集成学习(Ensemble Learning)—袋装(bagging),随机森林(Random Forest)

第七章.集成学习 (Ensemble Learning) 7.1 集成学习—袋装(bagging),随机森林(Random Forest) 集成学习就是组合多个学习器&#xff0c;最后得到一个更好的学习器。 1.常见的4种集成学习算法 个体学习器之间不存在强依赖关系&#xff0c;袋装&#xff08;bagging&#xff09;…