arrify 轉(zhuǎn)數(shù)組實現(xiàn)示例源碼解析
學(xué)習(xí)目標(biāo)
- 分析 arrify 函數(shù)的源碼
- 通過測試用例調(diào)試源碼
- 學(xué)習(xí) Symbol.iterator 的使用場景
- 其它的可迭代對象
拉取源碼
進(jìn)入到 arrify 倉庫下,使用 CodeSpace 克隆一份項目。
項目目錄如圖:
忽略掉一些配置文件,各個文件的功能如下:
index.js
是整個項目的入口,負(fù)責(zé)對外導(dǎo)出arrify
函數(shù)index.d.ts
是arrify
函數(shù)的TS
類型描述文件test.js
是測試用例
分析源碼
arrify函數(shù)可以接受一個值,并返回一個包含該值的數(shù)組,根據(jù)傳入不同類型的值返回不同的結(jié)果。
export default function arrify(value) { // 如果傳入的值是 null 或 undefined,函數(shù)會返回一個空數(shù)組。 if (value === null || value === undefined) { return []; } // 如果傳入的值本身就是一個數(shù)組,函數(shù)會直接返回這個數(shù)組 if (Array.isArray(value)) { return value; } // 如果傳入的值是一個字符串,函數(shù)會返回一個包含該字符串的數(shù)組。 if (typeof value === 'string') { return [value]; } // 如果傳入的值是一個可迭代對象,函數(shù)會返回一個包含該對象所有元素的數(shù)組。 if (typeof value[Symbol.iterator] === 'function') { return [...value]; } // 如果傳入的值既不是 null/undefined,也不是一個數(shù)組/字符串/可迭代對象,函數(shù)會返回一個包含該值的數(shù)組。 return [value]; }
Symbol.iterator 的使用場景
Symbol.iterator
是 JavaScript 中的一個內(nèi)置 Symbol,它用于定義一個對象的默認(rèn)迭代器。當(dāng)一個對象被用于 for...of
循環(huán)或者解構(gòu)賦值時,會自動調(diào)用它的 Symbol.iterator
方法。
舉個例子,假設(shè)你有一個數(shù)組,你可以使用 Symbol.iterator
方法來定義如何遍歷這個數(shù)組:
const numbers = [1, 2, 3]; numbers[Symbol.iterator] = function() { let i = 0; return { next: function() { return { value: numbers[i] + 1, done: i++ === numbers.length }; } }; }; for (const num of numbers) { console.log(num); }
上面的代碼定義了一個數(shù)組 numbers
,并為它定義了一個 Symbol.iterator
方法,這個方法返回一個迭代器對象,這個對象的 next
方法返回數(shù)組的下一個元素。然后我們使用 for...of
循環(huán)來遍歷這個數(shù)組,循環(huán)會自動調(diào)用 numbers
的 Symbol.iterator
方法來獲取每個元素+1后的值。
上面代碼執(zhí)行的執(zhí)行結(jié)果:
可見我們更改了 array 的默認(rèn)迭代器。
具有默認(rèn)的迭代器函數(shù)的對象
這些對象能夠被 for...of
循環(huán)遍歷
- 數(shù)組
- 字符串
- Map(Map)
- Set(Set)
總結(jié)
總之,一個數(shù)據(jù)結(jié)構(gòu)如果具有Symbol.iterator
屬性,這個對象就可以被for...of
遍歷它的成員。我們理解iteration的原理可以更好使用js提供的數(shù)據(jù)結(jié)構(gòu),必要時還可以改造不可迭代的數(shù)據(jù)結(jié)構(gòu)。
以上就是arrify 轉(zhuǎn)數(shù)組實現(xiàn)示例源碼解析的詳細(xì)內(nèi)容,更多關(guān)于arrify 轉(zhuǎn)數(shù)組的資料請關(guān)注腳本之家其它相關(guān)文章!
- JavaScript將數(shù)組轉(zhuǎn)為對象與JSON對象字符串轉(zhuǎn)數(shù)組方法詳解
- JavaScript實現(xiàn)字符串轉(zhuǎn)數(shù)組的6種方法總結(jié)
- javascript算法之?dāng)?shù)組反轉(zhuǎn)
- JavaScript數(shù)組扁平轉(zhuǎn)樹形結(jié)構(gòu)數(shù)據(jù)(Tree)的實現(xiàn)
- JS 將偽數(shù)組轉(zhuǎn)換成數(shù)組的實現(xiàn)示例
- JavaScript如何將偽數(shù)組轉(zhuǎn)換成數(shù)組?
- TypeScript實現(xiàn)數(shù)組和樹的相互轉(zhuǎn)換
相關(guān)文章
自定義range?sliders滑塊實現(xiàn)元素拖動方法
這篇文章主要為大家介紹了自定義range?sliders滑塊實現(xiàn)元素拖動方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08微信小程序 詳解頁面跳轉(zhuǎn)與返回并回傳數(shù)據(jù)
這篇文章主要介紹了微信小程序 詳解頁面跳轉(zhuǎn)與返回并回傳數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下2017-02-02uniApp學(xué)習(xí)之熱門搜索,搜索數(shù)據(jù)頁面緩存實例
這篇文章主要介紹了uniApp學(xué)習(xí)之熱門搜索,搜索數(shù)據(jù)頁面緩存實例,需要的朋友可以參考下2023-10-10javascript的setTimeout()使用方法總結(jié)
這篇文章主要給大家分享javascript的setTimeout()使用方法總結(jié),js的setTimeout方法用處比較多,通常用在頁面刷新了、延遲執(zhí)行了等等,下面我們一起來看看文章對該內(nèi)容的具體總結(jié)吧,需要的朋友可以參考一下2021-11-11