Day07 JavaScript Returning 與 Mutating Function

閱讀時間約 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, 一個網站開發者。
有任何疑問或是想勘誤的話歡迎聯繫。

0會員
11內容數
留言0
查看全部
發表第一個留言支持創作者!
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
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
Thumbnail
JSDoc 全名是 JavaScript Documentation,顧名思義是為 JavaScript 所使用的 API 文件,在程式碼內透過註解的方式撰寫,運行後 JSDoc 會自動掃描註解內容,並生成一份網頁版的文件,對於沒有使用 Typescript 開發的專案,也
Thumbnail
一般在使用 TypeScript 的時候,大家都有遇過定義列舉資料的情境吧。 不過不管是 enum 和 literal 的方式其實都有些小缺點,以下推薦一個個人認為體驗更好的方式。
※ 用 faker 套件產生假資料步驟 安裝 faker套件:快速生成假資料(人名、地名、時間)。 npm install [email protected] 引入 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
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
Thumbnail
JSDoc 全名是 JavaScript Documentation,顧名思義是為 JavaScript 所使用的 API 文件,在程式碼內透過註解的方式撰寫,運行後 JSDoc 會自動掃描註解內容,並生成一份網頁版的文件,對於沒有使用 Typescript 開發的專案,也
Thumbnail
一般在使用 TypeScript 的時候,大家都有遇過定義列舉資料的情境吧。 不過不管是 enum 和 literal 的方式其實都有些小缺點,以下推薦一個個人認為體驗更好的方式。
※ 用 faker 套件產生假資料步驟 安裝 faker套件:快速生成假資料(人名、地名、時間)。 npm install [email protected] 引入 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)。