Day07 JavaScript Returning 與 Mutating Function

更新於 2024/11/04閱讀時間約 9 分鐘


在開始討論這兩個陌生的名詞之前,我們先準備一份資料以便後續測試使用。

raw-image

這筆資料是users的資料,可能是社群平台用來記錄使用者資料的格式。其中users是一個array([]包著),裡面包含了3個Object({}包著),每個Object內有許多的property-value配對(如id: 3username: “kbrunton2”等),以逗號分隔,換行只是因為方便閱讀。


接著使用之前講過,每個array內建的push()method,將一筆新的資料放進users的最後。然後用console.log()來看看users裡面現在是什麼。

raw-image
我用瀏覽器的Console,每個瀏覽器的Console顯示出來的可能稍有差異。

我用瀏覽器的Console,每個瀏覽器的Console顯示出來的可能稍有差異。

我們會發現users現在有編號0-3(紫色的數字),是總共4筆使用者資料的array了。


這不是什麼新內容,我們之前就學過array裡包含著object的情況,也見過array的push()method。現在再次提到,是因為這就是了解Mutating FunctionReturning Function的絕佳範例。

Mutating vs Returning

Mutating的意思「改變」,Mutating Function的意思是這個function會改變原本的值。以push()為例,本來只有3個內容的的arrayuserspush()這個method改變成4個內容。特別的事,push()做的不只是這樣,它還會Return(回傳)一個數值,被改變過後的array的長度(在這個情況就是4)。


我們可以把整串給印出來,看看這是如何運作的。

raw-image

users.push()會回傳新array的長度(4),這個數值被console.log()印在Console裡面,我們就會看見4。像這樣會回傳一個值的function被稱作Returning Function。


你會發現push()method同時擁有兩種身份,它是Mutating Function,也是Returning Function。這件事情為什麼那麼重要?因為JavaScript內建常用的method行為各有差異,有些只是Mutating Function,有些是Returning,有些就像這個例子,兩者都是。光是事先了解一個method是哪種類別,你就可以預測它的行為。

有些人會覺得JS這樣的設計是靈活的,有些人覺得是凌亂的,褒貶不一。

重要的常見Method

Map

map()是其中一個array內建的method,它幾乎就是最常見的那個。map()常常用在將array資料根據某種條件複製一份。舉例來說,假設我只需要上述users的資料中name的那一項,而且也想將這些使用者的name存成array的形式,就很適合使用map()


我們可以這樣寫:

每個array都內建map()這個method。

每個array都內建map()這個method。

map()會根據條件回傳一個新的array,它不會Mutate(變更)原本的users array。換句話說map()是一個Returning Function而不是Mutating Function。而map()會需要一個function作為參數,讓它知道根據什麼條件回傳,因此它也是一個Higher-Order Function。我們繼續看下去。


raw-image

map()裡面需要一個function作為參數,我們定義一個onlyNameTest()來供它使用。map()會做的事就是對每一個usersarray裡的元素做一次onlyNameTest()這個操作,然後把onlyNameTest()回傳的內容放進新的array裡面。


以目前的情況為例,這個onlyNameTest()會執行4次(因為usersarray有4個元素),每一次都會回傳”hello”,放進新的array裡面。

raw-image

結果就是newArray裡面會有4個”hello”


現在我們來嘗試製作一個只有username的新array。

raw-image

我們一樣使用map()來根據舊的array產生新的。其中users裡的每個項目都會被onlyName()function作為參數使用,我們把參數命名成user。接下來只要回傳每一個userusername這個property就可以了,.來存取username


最後把這個結果儲存到新的arrayusersOnlyName,並印在Console。

raw-image

成功得到一個新的長度為4的array,裡面只有username而且原本的usersarray並沒有被改變

Filter

filter()在各方面都跟map()很類似,它一樣是array的method、會回傳一個新的array、需要另一個function作為參數等等。

假設我們現在想要找出所有gender: “Female”的資料,並且同樣存在array裡面,filter()完美的完成這個任務。

raw-image

同樣的,在filter()參數這裡我們傳給它一個functiononlyFemale(),讓它重複執行,在這情況下它一樣會執行4次(因為array的長度是4)。跟map()不同的是,filter()的機制是根據onlyFemale()回傳的結果true或是false來決定要不要把內容放進新array


raw-image

用這個user.gender == ‘Female’ 條件判斷是不是該保留。最後就可以得到gender: ‘Female’的新array了。

raw-image

可以發現array的長度剩3,因為在users裡面只有3個gender: ‘Female’的資料,它們被filter()成功的過濾出來了。

連續使用

到這裡可能還是讓人困惑,到底為什麼要特別介紹幾個method?主要是這對我們了解HOF在JS的運作很有幫助,因為第一眼見到以下的內容會顯得很奇怪。

我們再接著定義另一個function用來filter,這個function叫做onlyIdLargerThanTwo()用來找到id > 2的user。

raw-image

從這段可以看見一個JavaScript特殊的使用方式,我連續使用了兩個filter()。由於第一個filter()是Returning Function會回傳一個新array新的array又可以用filter()method,可以一直按照這種方式接續下去,變成一個chain(鏈)


由於map()也是Returning Function,我們也可以在後面加上map(),並使用一開始定義的onlyName()function只留下名稱。

換行只是方便閱讀而已。

換行只是方便閱讀而已。

raw-image

最後呈現出來的結果就是符合gender: 'Female'又符合id > 2的使用者的username


這種連續使用的情境在JS裡面屢見不鮮,由於這些內建的method都是會回傳array的Returning Function,才得以實現這種寫法,這也是我們特別介紹特定這幾個method的原因。第一次見的人可能會無法理解為什麼寫了一長串。

小結

在今天的內容裡,我們了解什麼是Mutating FunctionReturning Function。其中很特別的是Returning Function在某些特定的情況下可以連續的使用、串接在一起,這是JavaScript裡面很常見的操作,而且不僅限於在array上運用。這讓map()filter()之類的method,即使不變更原來array的值(not mutating),依然強大好用。


明天,我們會討論Context & Scope,這是連資深工程師都可能需要花點時間釐清的部分,我們會一一討論。


Resource

今日Codepen

連結

Credits

關於我

我是Erkin, 一個網站開發者。
有任何疑問或是想勘誤的話歡迎聯繫。

avatar-img
0會員
11內容數
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
HCY 71的沙龍 的其他內容
Higher-Order Function(高階方程式) 是什麼 Higher-Order Function簡稱HOF,是指一個以function作為參數的function或者回傳function的function,我知道目前聽起來非常抽象,我們舉一個我們之前就已經看過的例子。 以Funct
做選擇的時刻 程式語言中,做選擇是非常常見的一件事。例如:判斷登入者身份是否為管理員、當前設定是否為深色模式等。想像我們有一個交易系統,我們需要判斷使用者帳戶餘額是否足夠購買Apple Vison Pro。首先,我們必須認識if跟else。 if 和 else if跟else是常見的條件判
什麼是Array(陣列) array跟object一樣是一種資料的容器,不同的是array通常用來裝同類別的資料,就像是書架用來收納書。要在書架裡放書跟其他東西也是可以的,但就是有點奇怪,不是大家習慣的做法。 array透過[]宣告。 假設我們要儲存使用者喜歡的顏色這筆資料,每筆資料的類型
今天我們會繼續用CodePen。 為何需要Object(物件) 在開始介紹object之前,我們先來討論object為何需要存在。 想像我們有一筆關於網站使用者的資料,裡面包含使用者名稱、年紀,還有sayHelloToUser()這個function。 我們可以逐個定義、宣告這些資料。
從今天開始往後的的內容會有許多的「註解」,程式不會執行被註解的內容,註解只是方便開發者辨識。JS內的註解主要有兩種。單行註解是在程式碼前方加上//,可以透過快捷鍵cmd(ctrl) + / 完成。多行註解則是用/* 及 */前後包夾要註解的內容。 轉換環境 從上個單元的經驗,有些人可能會發現
歡迎來到「10日 JavaScript」,有鑑於自己先前學習JavaScript的流程過於破碎且凌亂,特別整理了這份文章,包含了基本語法、資料型態、常用函數及JavaScript實作等。希望能幫助到一些需要用到、想要了解JavaScript的人,讓大家不必再走太崎嶇的路。內容會分成10篇,一步步
Higher-Order Function(高階方程式) 是什麼 Higher-Order Function簡稱HOF,是指一個以function作為參數的function或者回傳function的function,我知道目前聽起來非常抽象,我們舉一個我們之前就已經看過的例子。 以Funct
做選擇的時刻 程式語言中,做選擇是非常常見的一件事。例如:判斷登入者身份是否為管理員、當前設定是否為深色模式等。想像我們有一個交易系統,我們需要判斷使用者帳戶餘額是否足夠購買Apple Vison Pro。首先,我們必須認識if跟else。 if 和 else if跟else是常見的條件判
什麼是Array(陣列) array跟object一樣是一種資料的容器,不同的是array通常用來裝同類別的資料,就像是書架用來收納書。要在書架裡放書跟其他東西也是可以的,但就是有點奇怪,不是大家習慣的做法。 array透過[]宣告。 假設我們要儲存使用者喜歡的顏色這筆資料,每筆資料的類型
今天我們會繼續用CodePen。 為何需要Object(物件) 在開始介紹object之前,我們先來討論object為何需要存在。 想像我們有一筆關於網站使用者的資料,裡面包含使用者名稱、年紀,還有sayHelloToUser()這個function。 我們可以逐個定義、宣告這些資料。
從今天開始往後的的內容會有許多的「註解」,程式不會執行被註解的內容,註解只是方便開發者辨識。JS內的註解主要有兩種。單行註解是在程式碼前方加上//,可以透過快捷鍵cmd(ctrl) + / 完成。多行註解則是用/* 及 */前後包夾要註解的內容。 轉換環境 從上個單元的經驗,有些人可能會發現
歡迎來到「10日 JavaScript」,有鑑於自己先前學習JavaScript的流程過於破碎且凌亂,特別整理了這份文章,包含了基本語法、資料型態、常用函數及JavaScript實作等。希望能幫助到一些需要用到、想要了解JavaScript的人,讓大家不必再走太崎嶇的路。內容會分成10篇,一步步
你可能也想看
Google News 追蹤
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
JSDoc 全名是 JavaScript Documentation,顧名思義是為 JavaScript 所使用的 API 文件,在程式碼內透過註解的方式撰寫,運行後 JSDoc 會自動掃描註解內容,並生成一份網頁版的文件,對於沒有使用 Typescript 開發的專案,也
Thumbnail
一般在使用 TypeScript 的時候,大家都有遇過定義列舉資料的情境吧。 不過不管是 enum 和 literal 的方式其實都有些小缺點,以下推薦一個個人認為體驗更好的方式。
※ 用 faker 套件產生假資料步驟 安裝 faker套件:快速生成假資料(人名、地名、時間)。 npm install faker@5.5.3 引入 faker 套件: const faker = require('faker') 建立data資料夾來生成假資料。創建一個名為 gene
Thumbnail
此章節旨在介紹Java的基本語法、註解和變數的使用。透過學習,讀者將了解Java程式的基本結構、程式進入點的定義、如何撰寫單行和多行註解,以及如何宣告和初始化變數。
Thumbnail
你好,在下最近在學習開發web,學了html css js,也得出一些心得,由於網路上已有許多教學,所以我會著重在如何開發出to do List,以及解釋我寫的程式碼。相關的教學我會直接貼網址。如果我有什麼地方出錯,或者是可以寫得更好,歡迎在下方留言,討論。 首先先介紹我的開發環境: 我用了vs
Thumbnail
本章節旨在介紹TypeScript的基本語法,包括一般結構、程式進入點、註解以及變數的定義和賦值。這些知識將幫助讀者瞭解TypeScript的基本架構,並且可以開始使用TypeScript進行開發。
Thumbnail
我們在實作中,難免會遇到在不同組件中,卻有需求相同的資料格式,因此 mixins 可以達到我們的需求,除了 data 以外也包含了 methods 可以共用,舉例來說,學生資料可能會在,班級跟社團內被使用,當我們要撰寫元件時,就可以省略多餘的 data 定義。
Thumbnail
本章節旨在介紹JavaScript中的物件導向編程。內容包括類別(Class)的定義和使用,建構子的作用,以及公開,私有,受保護(Protected)等不同訪問修飾符的概念。此外,還涵蓋了繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda表達式、泛型、反射等物件導向的主要觀念。
Thumbnail
在網頁開發中,時間與日期的處理是重要且基礎的部分,本文將介紹 JavaScript 中的日期的處理方法,並提供範例程式來協助你理解。
Thumbnail
在之前的文章當中曾經提到過 JavaScript 中的物件有一個特別的機制:傳參考(Called by reference),如果正確性再高一點的話,則可以稱之為傳共享(Called by sharing)。
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
JSDoc 全名是 JavaScript Documentation,顧名思義是為 JavaScript 所使用的 API 文件,在程式碼內透過註解的方式撰寫,運行後 JSDoc 會自動掃描註解內容,並生成一份網頁版的文件,對於沒有使用 Typescript 開發的專案,也
Thumbnail
一般在使用 TypeScript 的時候,大家都有遇過定義列舉資料的情境吧。 不過不管是 enum 和 literal 的方式其實都有些小缺點,以下推薦一個個人認為體驗更好的方式。
※ 用 faker 套件產生假資料步驟 安裝 faker套件:快速生成假資料(人名、地名、時間)。 npm install faker@5.5.3 引入 faker 套件: const faker = require('faker') 建立data資料夾來生成假資料。創建一個名為 gene
Thumbnail
此章節旨在介紹Java的基本語法、註解和變數的使用。透過學習,讀者將了解Java程式的基本結構、程式進入點的定義、如何撰寫單行和多行註解,以及如何宣告和初始化變數。
Thumbnail
你好,在下最近在學習開發web,學了html css js,也得出一些心得,由於網路上已有許多教學,所以我會著重在如何開發出to do List,以及解釋我寫的程式碼。相關的教學我會直接貼網址。如果我有什麼地方出錯,或者是可以寫得更好,歡迎在下方留言,討論。 首先先介紹我的開發環境: 我用了vs
Thumbnail
本章節旨在介紹TypeScript的基本語法,包括一般結構、程式進入點、註解以及變數的定義和賦值。這些知識將幫助讀者瞭解TypeScript的基本架構,並且可以開始使用TypeScript進行開發。
Thumbnail
我們在實作中,難免會遇到在不同組件中,卻有需求相同的資料格式,因此 mixins 可以達到我們的需求,除了 data 以外也包含了 methods 可以共用,舉例來說,學生資料可能會在,班級跟社團內被使用,當我們要撰寫元件時,就可以省略多餘的 data 定義。
Thumbnail
本章節旨在介紹JavaScript中的物件導向編程。內容包括類別(Class)的定義和使用,建構子的作用,以及公開,私有,受保護(Protected)等不同訪問修飾符的概念。此外,還涵蓋了繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda表達式、泛型、反射等物件導向的主要觀念。
Thumbnail
在網頁開發中,時間與日期的處理是重要且基礎的部分,本文將介紹 JavaScript 中的日期的處理方法,並提供範例程式來協助你理解。
Thumbnail
在之前的文章當中曾經提到過 JavaScript 中的物件有一個特別的機制:傳參考(Called by reference),如果正確性再高一點的話,則可以稱之為傳共享(Called by sharing)。