<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在上週看做專案的時候看到了專案裡封裝的 axios
,對其封裝的原理沒有弄清楚,於是週末的時候便抽了點空閒時間來看了看 axios
的原始碼,將其研究研究。
這裡就不單獨介紹 axios
了,對於 axios
想必大家都有過了解。咱們直接進入原始碼閱讀的主題。我們今天主要看的是原始碼中的utils.js檔案,裡面包含了很多工具函數。
這是擷取的其中一部分,粗略看下來大概有四五十個工具函數,接下來開始分享其中一些這裡面我平時不怎麼見到過或者用到過的工具函數,來學習一下。
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
主要作用是獲取物件的型別。有點類似於 typeof
,typeof
是判斷物件的型別的作用。
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
的建構函式進行判斷。
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; }
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
是用來判斷純物件的,純物件可以理解為純粹的物件。
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
。
function trim(str) { return str.trim ? str.trim() : str.replace(/^s+|s+$/g, ''); }
這個方法在專案中有用到過,但是用的頻率並不是很高,是用來去除字串兩側的空白字元的。
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
值的,也可以說是鍵值吧。
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
。
function stripBOM(content) { if (content.charCodeAt(0) === 0xFEFF) { content = content.slice(1); } return content; }
這個函數是用來去除編碼中的 BOM
的,這個確實沒怎麼見過或者聽說過。
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
)。
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; }
這個函數可以將類陣列轉換為陣列,裡面的邏輯實現不難理解,相對比較簡單。
const toCamelCase = str => { return str.toLowerCase().replace(/[_-s]([a-zd])(w*)/g, function replacer(m, p1, p2) { return p1.toUpperCase() + p2; } ); };
都知道駝峰命名法吧,這個函數可以將字串轉換為駝峰命名。類似於把 abcdef
的字元轉換成 abcDef
。
僅僅看一遍是遠遠不夠的,這原始碼裡覆蓋了太多工具函數,這裡我閱讀了其中十幾種。通過簡單閱讀了一遍 axios
的原始碼,讓我對 axios
有了進一步認識,關於剩下的原始碼部分,下週會繼續抽時間完成閱讀學習。總之,我認為 axios
原始碼可以多看幾遍,每一遍或許都會有不同的認識。
以上就是一文帶你掌握axios 工具函數的詳細內容,更多關於axios 工具函數的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45