JavaScript手寫源碼之實(shí)現(xiàn)arrify轉(zhuǎn)數(shù)組
上一篇文章寫了omit.js 剔除對象中的屬性,相對而言比較簡單。這一篇實(shí)現(xiàn)一個(gè)比較簡易的庫。
添加測試文件
依然和上篇文章一樣,使用vitest
測試,具體怎么操作可以移步上一篇文章,這里我們就只寫寫測試文件了。
import { test, expect } from "vitest" import { arrify } from "." test("main", () => { expect(arrify("foo")).toEqual(["foo"]) expect(arrify(null)).toEqual([]) expect(arrify(undefined)).toEqual([]) expect(arrify([1, 2])).toEqual([1, 2]) expect(arrify(new Map([[1, 2]]))).toEqual([[1, 2]]) expect(arrify(new Set([1, 2]))).toEqual([1, 2]) })
實(shí)現(xiàn)arrify
毫無疑問我們需要實(shí)現(xiàn)一個(gè)arrify
函數(shù)并導(dǎo)出,并且需要傳入?yún)?shù)。
傳入字符串
首先看這個(gè)測試
expect(arrify("foo")).toEqual(["foo"])
arrify
傳入一個(gè)字符串,返回的是一個(gè)數(shù)組,而且這個(gè)數(shù)組將我們傳入的字符串包裹起來。那我們可以很簡單的實(shí)現(xiàn)出來。
export function arrify(value) { if (typeof value === "string") { return [value] } }
傳入null或undefined
下面看下這個(gè)測試
expect(arrify(null)).toEqual([]) expect(arrify(undefined)).toEqual([])
如果傳入的是null
或者undefined
則直接返回[]
export function arrify(value) { if (value === null || value === undefined) { return [] } ··· }
傳入數(shù)組
expect(arrify([1, 2])).toEqual([1, 2])
如果傳入的是數(shù)組,則直接返回
export function arrify(value) { ··· if (Array.isArray(value)) { return value } ··· }
可迭代對象
expect(arrify(new Map([[1, 2]]))).toEqual([[1, 2]]) expect(arrify(new Set([1, 2]))).toEqual([1, 2])
這里要著重介紹一下。Symbol.iterator
為每一個(gè)對象定義了默認(rèn)的迭代器。當(dāng)需要對一個(gè)對象進(jìn)行迭代時(shí)(比如開始用于一個(gè)for..of
循環(huán)中),它的@@iterator
方法都會(huì)在不傳參情況下被調(diào)用,返回的迭代器用于獲取要迭代的值。
一些內(nèi)置類型擁有默認(rèn)的迭代器行為,其他類型(如 Object)則沒有。下表中的內(nèi)置類型擁有默認(rèn)的@@iterator
方法:
- Array.prototype[@@iterator]()
- TypedArray.prototype[@@iterator]()
- String.prototype[@@iterator]()
- Map.prototype[@@iterator]()
- Set.prototype[@@iterator]()
我們可以像下面這樣創(chuàng)建自定義的迭代器:
var myIterable = {} myIterable[Symbol.iterator] = function* () { yield 1; yield 2; yield 3; }; [...myIterable] // [1, 2, 3]
所以我們想要讓測試通過就可以判斷value[Symbol.iterator]
的類型是不是function
即可
export function arrify(value) { ··· if (typeof value[Symbol.iterator] === "function") { return [...value] } }
總結(jié)
以上就是我實(shí)現(xiàn)的一個(gè)手寫arrify
庫。在手寫過程中,會(huì)有很多自己的想法,思考測試該怎么寫,思考代碼該怎么重構(gòu),更重要的是你真的懂了源碼,把它寫下來就變成你自己的了。剛開始手寫的庫比較簡單,后面會(huì)不斷的給自己加大難度。
到此這篇關(guān)于JavaScript手寫源碼之實(shí)現(xiàn)arrify轉(zhuǎn)數(shù)組的文章就介紹到這了,更多相關(guān)JavaScript arrify轉(zhuǎn)數(shù)組內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JS實(shí)現(xiàn)圖片旋轉(zhuǎn)動(dòng)畫效果封裝與使用示例
這篇文章主要介紹了JS實(shí)現(xiàn)圖片旋轉(zhuǎn)動(dòng)畫效果封裝與使用,結(jié)合實(shí)例形式分析了JavaScript實(shí)現(xiàn)圖片元素旋轉(zhuǎn)的相關(guān)功能代碼的封裝與使用操作技巧,需要的朋友可以參考下2018-07-07JS實(shí)現(xiàn)十分鐘倒計(jì)時(shí)代碼實(shí)例
在本篇文章里我們給大家分享了關(guān)于JS實(shí)現(xiàn)十分鐘倒計(jì)時(shí)的相關(guān)實(shí)例代碼,有需要的朋友們可以學(xué)習(xí)下。2018-10-10javascript實(shí)現(xiàn)仿IE頂部的可關(guān)閉警告條
仿windows IE頂部的敬告工具條,帶關(guān)閉按鈕,設(shè)計(jì)還算精美,你完全可以用到自己的網(wǎng)頁用于顯示提示等方面,有需要的小伙伴可以參考下。2015-05-05uniapp 對于scroll-view滑動(dòng)和頁面滑動(dòng)的聯(lián)動(dòng)處理方法
這篇文章主要介紹了uniapp 對于scroll-view滑動(dòng)和頁面滑動(dòng)的聯(lián)動(dòng)處理方法,本文通過示例代碼給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧2024-08-08layui復(fù)選框的全選與取消實(shí)現(xiàn)方法
今天小編就為大家分享一篇layui復(fù)選框的全選與取消實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-09-09javascript網(wǎng)頁關(guān)閉時(shí)提醒效果腳本
當(dāng)頁面載入和關(guān)閉時(shí)會(huì)出現(xiàn)一些提示信息的代碼。方便提醒用戶,但不建議多用,讓人感到反感。2008-10-10