解析arrify 轉陣列實現示例原始碼
導讀 | 這篇文章主要為大家介紹了arrify 轉陣列實現示例原始碼解析,有需要的朋友可以借鑑參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪 |
- 分析 arrify 函式的原始碼
- 透過測試用例除錯原始碼
- 學習 Symbol.iterator 的使用場景
- 其它的可迭代物件
- index.js是整個專案的入口,負責對外匯出arrify函式
- index.d.ts是arrify函式的TS型別描述檔案
- test.js是測試用例
進入到 arrify 倉庫下,使用 CodeSpace 克隆一份專案。
專案目錄如圖:
忽略掉一些配置檔案,各個檔案的功能如下:
arrify函式可以接受一個值,並返回一個包含該值的陣列,根據傳入不同型別的值返回不同的結果。
export default function arrify(value) { // 如果傳入的值是 null 或 undefined,函式會返回一個空陣列。 if (value === null || value === undefined) { return []; } // 如果傳入的值本身就是一個陣列,函式會直接返回這個陣列 if (Array.isArray(value)) { return value; } // 如果傳入的值是一個字串,函式會返回一個包含該字串的陣列。 if (typeof value === 'string') { return [value]; } // 如果傳入的值是一個可迭代物件,函式會返回一個包含該物件所有元素的陣列。 if (typeof value[Symbol.iterator] === 'function') { return [...value]; } // 如果傳入的值既不是 null/undefined,也不是一個陣列/字串/可迭代物件,函式會返回一個包含該值的陣列。 return [value]; }
Symbol.iterator 是 JavaScript 中的一個內建 Symbol,它用於定義一個物件的預設迭代器。當一個物件被用於 for...of 迴圈或者解構賦值時,會自動呼叫它的 Symbol.iterator 方法。
舉個例子,假設你有一個陣列,你可以使用 Symbol.iterator 方法來定義如何遍歷這個陣列:
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); }
上面的程式碼定義了一個陣列 numbers,併為它定義了一個 Symbol.iterator 方法,這個方法返回一個迭代器物件,這個物件的 next 方法返回陣列的下一個元素。然後我們使用 for...of 迴圈來遍歷這個陣列,迴圈會自動呼叫 numbers 的 Symbol.iterator 方法來獲取每個元素+1後的值。
上面程式碼執行的執行結果:
可見我們更改了 array 的預設迭代器。
這些物件能夠被 for...of 迴圈遍歷
總之,一個資料結構如果具有Symbol.iterator屬性,這個物件就可以被for...of遍歷它的成員。我們理解iteration的原理可以更好使用js提供的資料結構,必要時還可以改造不可迭代的資料結構。
原文來自:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2933014/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- NumPy迭代陣列的實現示例陣列
- Vue原始碼解析之陣列變異Vue原始碼陣列
- 影片直播app原始碼,JS使用陣列方法實現字串反轉APP原始碼JS陣列字串
- await 錯誤捕獲實現方式原始碼示例解析AI原始碼
- 直播平臺原始碼,FlinkSQL實現行轉列原始碼SQL
- Java併發包原始碼學習系列:阻塞佇列實現之SynchronousQueue原始碼解析Java原始碼佇列
- Java併發包原始碼學習系列:阻塞佇列實現之DelayQueue原始碼解析Java原始碼佇列
- DELPHI也可以實現控制元件陣列,用定義陣列變數實現控制元件陣列 (轉)控制元件陣列變數
- LinkedList 基本示例及原始碼解析原始碼
- 深入原始碼解析 tapable 實現原理原始碼
- Java併發包原始碼學習系列:阻塞佇列實現之LinkedTransferQueue原始碼解析Java原始碼佇列
- Java併發包原始碼學習系列:阻塞佇列實現之ArrayBlockingQueue原始碼解析Java原始碼佇列BloC
- Java併發包原始碼學習系列:阻塞佇列實現之PriorityBlockingQueue原始碼解析Java原始碼佇列BloC
- Laravel 佇列原始碼解析Laravel佇列原始碼
- Java實現普通二維陣列和稀疏陣列的相互轉換Java陣列
- php陣列轉xml的遞迴實現PHP陣列XML遞迴
- C#實現控制元件陣列 (轉)C#控制元件陣列
- 面試最常問的陣列轉樹,樹轉陣列 c++ web框架paozhu實現面試陣列C++Web框架
- Java併發包原始碼學習系列:阻塞佇列實現之LinkedBlockingDeque原始碼解析Java原始碼佇列BloC
- Java併發包原始碼學習系列:阻塞佇列實現之LinkedBlockingQueue原始碼解析Java原始碼佇列BloC
- 原始碼解析C#中PriorityQueue(優先順序佇列)的實現原始碼C#佇列
- C++ 簡單實現陣列類泛型程式設計示例C++陣列泛型程式設計
- 原始碼解析.Net中DependencyInjection的實現原始碼
- Netty原始碼解析 -- PoolSubpage實現原理Netty原始碼
- Netty原始碼解析 -- PoolChunk實現原理Netty原始碼
- InnoDB MVCC實現原理及原始碼解析MVC原始碼
- 透過Span實現高效能陣列,例項解析陣列
- 阻塞佇列 SynchronousQueue 原始碼解析佇列原始碼
- 阻塞佇列 DelayQueue 原始碼解析佇列原始碼
- jQuery實現對陣列元素的轉換效果jQuery陣列
- 在C++中實現變長陣列 (轉)C++陣列
- JS 陣列 API 原始碼淺析JS陣列API原始碼
- Swift中實現Array陣列和NSArray陣列的相互轉換與遍歷Swift陣列
- spring原始碼解析 (七) 事務底層原始碼實現Spring原始碼
- 陣列排序的實現陣列排序
- golang實現稀疏陣列Golang陣列
- 陪玩系統原始碼中陣列去重的實現程式碼,簡單卻重要原始碼陣列
- Node.js原始碼解析-Readable實現Node.js原始碼