探索JavaScript未來模式匹配的引入分析
引言
今天,揭開一個(gè)令人興奮的功能的面紗,這個(gè)功能通常在 Elixir 這樣的函數(shù)式編程語言中看到,現(xiàn)在被提議用于 JavaScript ——模式匹配。
"你好,JavaScript!"
動(dòng)手試試。這里有一個(gè)超基礎(chǔ)的函數(shù)叫做 greet
,它接受一個(gè)帶有'ID'和'role'的用戶,并根據(jù)用戶角色返回問候語。聽起來簡(jiǎn)單嗎?
function greet({id, role}) { if (role == 'user'){ return `Hello User ${id}`; } if (role == 'admin'){ return `Hello Admin ${id}`; } if (role == 'owner'){ return `Hello Owner ${id}`; } throw `Invalid role: ${role}`; }
這很像一個(gè) switch
語句,但我們很難說這完全準(zhǔn)確——它笨拙,充斥著討厭的if
語句,對(duì)于一個(gè)未定義的角色還有一個(gè)錯(cuò)誤陷阱。
function greet({id, role}) { switch (role){ case 'user': return `Hello User ${id}`; case 'admin': return `Hello Admin ${id}`; case 'owner': return `Hello Owner ${id}`; default: throw `Invalid role: ${role}`; } }
switch
還可以,但這里我們遇到了一個(gè)問題--如果不使用一些奇怪的黑客手段,例如在 true
上進(jìn)行切換,它就無法完成足夠的工作。
簡(jiǎn)化復(fù)雜性的模式匹配藝術(shù)
模式匹配可以結(jié)束這種復(fù)雜性。想象一個(gè)你有一個(gè) when
子句可以救我們擺脫這種冗長(zhǎng)的迷宮的世界。
簡(jiǎn)單地說,模式匹配允許我們檢查一個(gè)輸入是否符合一個(gè)模式或一個(gè)特定的類型。
在繼續(xù)之前,需求注意的——現(xiàn)在看的是一個(gè)提議。所以,這可能還不是最終的語法。
let greet = match (input) { when { role: "user" }: `Hello User ${input.id}`, when { role: "admin" }: `Hello Admin ${input.id}`, when { role: "owner" }: `Hello Owner ${input.id}`, _: throw `Invalid role: ${input.role}`, }
在這里,match
函數(shù)接受輸入,when
子句檢查 input
中的角色是否匹配指定的角色 - user
, admin
, owner
。
這樣更清晰,不是嗎?不再有 if
或 switch clutter
- 只有一個(gè)簡(jiǎn)潔而干凈的表達(dá)式。這不僅允許更易讀和可維護(hù)的代碼,而且為基于輸入屬性的更簡(jiǎn)單的“行內(nèi)”決策鋪平了道路,使條件、行為和結(jié)果非常容易同時(shí)閱讀。
這會(huì)改變JavaScript的未來嗎?
我真的相信模式匹配可以極大地改善JavaScript的未來。通過直接從Elixir這樣的其他語言中獲取關(guān)鍵的想法,并與JavaScript的強(qiáng)大靈活性結(jié)合,我們肯定可以為“JavaScript之家”增加一個(gè)頂石。
但是,我希望看到我們最喜歡的語言走得更遠(yuǎn),尤其是當(dāng)模式匹配與函數(shù)定義結(jié)合使用時(shí)。這可能會(huì)讓我們走出舒適區(qū),但一旦你開始探索它,你就會(huì)意識(shí)到它所擁有的力量和它帶來的簡(jiǎn)單性。
def greet(%{role: "user", id: id}), do: `Hello User #{id}` def greet(%{role: "admin", id: id}), do: `Hello Admin #{id}` def greet(%{role: "owner", id: id}), do: `Hello Owner #{id}` def greet(%{role: _}), do: throw `Invalid role`
在這個(gè) Elixir 代碼示例中,我們根據(jù)輸入重新定義了函數(shù)三次。除了它給予的直接清晰性外,解剖這一點(diǎn),我們注意到它做了兩件事——它修剪了句法復(fù)雜性,顯著減少了理解代碼所需的心智負(fù)擔(dān)。
希望有一天JavaScript能夠?qū)崿F(xiàn)這種基于模式的函數(shù)重載,相信這將帶來一些最好的編程體驗(yàn)。就JavaScript的未來而言,作者認(rèn)為模式匹配是最令人興奮的前景之一。
以上就是JavaScript模式匹配的詳細(xì)內(nèi)容,更多關(guān)于JavaScript模式匹配的未來的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
使用HTTP?Referer實(shí)現(xiàn)圖片防盜圖文示例詳解
這篇文章主要為大家介紹了使用HTTP?Referer實(shí)現(xiàn)圖片防盜圖文示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08微信小程序 require機(jī)制詳解及實(shí)例代碼
這篇文章主要介紹了微信小程序 require機(jī)制詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2016-12-12JS前端宏任務(wù)微任務(wù)及Event Loop使用詳解
這篇文章主要為大家介紹了JS前端宏任務(wù)微任務(wù)及Event Loop使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07