Day09 JavaScript 其他關鍵內容

閱讀時間約 10 分鐘


今天要談的內容也是JavaScript很核心的部分,即使學完了先前的章節,馬上去看別人寫的JavaScript程式碼還是會看不懂,主要是因為JS開發者會採用各種簡化和替代的寫法,我們一一討論。

Anonymous(匿名) Function

首先我們要討論的是Anonymous(匿名) Function,在先前的章節中我們介紹過許多function的使用。那時候定義function一定會給名字,格式是這樣:

function 名稱() {}


但實際上在很多情況我們可以不給function指定名稱,我們稍微改寫一下的例子。

我們用document.addEventListener()來監聽'click'(滑鼠點擊),如果畫面被點擊eventAfterClicked()就會啟動,出現alert。

我們用document.addEventListener()來監聽'click'(滑鼠點擊),如果畫面被點擊eventAfterClicked()就會啟動,出現alert。

我們定義了eventAfterClicked()再把它放進addEventListener()的第二個參數,作為參考。但其實可以直接寫在參數裡面,這樣一來也不需要取名字,它就成為了anonymous function

我們直接在參數裡面寫這個function要幹嘛,而且沒有幫它取名字,這樣的function被稱為anonymous function。

我們直接在參數裡面寫這個function要幹嘛,而且沒有幫它取名字,這樣的function被稱為anonymous function。

它的格式就變成了:

function () {}

anonymous function常常出現在以function作為參數的情境(Higher-Order Function)。但值得注意的是,因為沒有名字,在其他地方完全無法取得這個function。所以如果那個function是需要重複使用的,最好還是另外定義。

Arrow(箭頭) Function

除了anonymous function,還有一種function的變體也很常出現,甚至幾乎是寫JS function的主流形式 — arrow function。

一樣用上面的例子,我們直接改寫成arrow function。

raw-image

function這個關鍵字刪掉,並且加上=>在小括號後面,我們就完成改寫了。

這就是arrow function的格式:

() => {}

主要就是讓定義function這件事變得更簡單、更容易。


簡化Arrow Function

arrow function還可以進一步簡化。


同樣舉例來說。

raw-image

我們有一個numbersarray,用map()這個method可以將它按照某種方式複製一份。map()的參數需要一個function,這個function會對每個numbers裡的元素做一次操作。每個元素是x,function回傳x * 2,於是最後我們可以得到一個數值被複製2倍的新array

順帶一提,原本的array不會被變更,因為map()不是mutating function。

順帶一提,原本的array不會被變更,因為map()不是mutating function。

這是我們之前就做過的事,目前只是把function改成anonymous的形式。


現在我們繼續改成arrow function,並一步一步簡化。

取消關鍵字function,加上=>就成了arrow function。

取消關鍵字function,加上=>就成了arrow function。


如果都寫在一行,return{}可以不寫(要一起不寫)。

arrow function沒有return和{}時會自動return後面的內容(x * 2)。

arrow function沒有return和{}時會自動return後面的內容(x * 2)。


還可以再簡化!

arrow function的參數如果只有一個,可以不用寫()

raw-image


這跟一開始差別可大了。

raw-image

這也就是很多人看到arrow function不一定能理解的原因之一,它簡單的太過分了。但從省略關鍵字開始,我們一步一步了解了它如何變成現在這樣。


Arrow Function裡的this

arrow function裡還有一點很特別,我們先前提到的this關鍵字在這裡運作有點不同。讓我們回到上個單元的例子。

 上個單元裡我們在eat()裡面再定義了一個function叫做hungry(),hungry()沒有特定對象呼叫它(不像me.eat()),所以this.firstName會呈現undefined。

上個單元裡我們在eat()裡面再定義了一個function叫做hungry(),hungry()沒有特定對象呼叫它(不像me.eat()),所以this.firstName會呈現undefined。


我們可以把hungry()改寫成arrow function:

去掉function關鍵字,加上=>就變成arrow function。

去掉function關鍵字,加上=>就變成arrow function。

要寫一個hungry()arrow function,我們會用let=再接arrow function。

這裡的this沒有因為在hungry()內需要另外處理。

這裡的this沒有因為在hungry()內需要另外處理。

從這裡可以看見,arrow function不會像傳統function一樣讓this的值被覆寫掉(寫在hungry()裡面和外面的this值都一樣!),是比較簡單、比較直覺的。


arrow function除了比較簡潔以外,還有保留context的特色,讓它成為大多工程師的第一個選擇。

Function Hoisting(提升)

我們之前就已經看過幾次這種情境了。

先使用function再定義function在JavaScript裡面是可行的。

先使用function再定義function在JavaScript裡面是可行的。


這樣其實不太合理,因為程式碼是一行一行執行的,通常都要先定義才能使用。

可以這樣寫的原因就是function hoisting的機制,用function關鍵字定義的會在背後被JS hoisting到最上方,優先處理。換句話說,在我們看不到的層面,其實定義sayHello()那幾行會被放在實際執行它之前,這段才會正常運作。


但除此之外,我們也見到了其他定義function的方式。

這是兩種把anonymous function指定成變數的方式。

這是兩種把anonymous function指定成變數的方式。

但這兩種寫法都沒有function hoisting,所以會出錯。神奇吧…這就是JavaScript的運作方式。

其實總歸一句,就不要再定義之前先用function嘛,這樣還滿不符合邏輯的,不太建議。不過至少你現在知道為什麼那些情況在JS裡面也是可行了。

Template Literal(模板字串)

之前把字串連接起來我們都是用””’’+這類的符號,寫起來又臭又長。

raw-image

除了這種寫法以外,還有一種叫做template literal的方式。主要是用backtick(``)來取代''"",backtick位在鍵盤上esc的下方或者在某些鍵盤中是esc本身透過組合鍵產生。


用template literal來改寫上述例子:

raw-image

我們可以把``想成是有特殊功能的""'',基本上引號能做到的它也能做到,但是多了一種能在文字中插入變數的能力。使用${}配合,就可以在string中放入變數或者計算式。用另外的角度說,在${}內可以寫JavaScript。上面的例子中我們就將me這個變數用template literal放入一串string之中。


如果裡面要放其他的JavaScript也都可以。

raw-image
${}內的2+2被計算成4了。

${}內的2+2被計算成4了。

比起原本的方式更加簡潔好寫了,是很推薦的用法。

關於分號

如同之前提到的,在JavaScript裡面有沒有加;在結尾都是可行的,在某些程式語言裡並不是這樣。這個運作邏輯是,「如果正常的換行,JavaScript在執行的時候會自動加上分號。」,我們看以下的例子。

raw-image

JavaScript會自動的在我們看不見的地方補上分號,給它正確的換行作為判斷標準是很重要的。我們其實也不太會把一堆東西寫在同一行啦,只是讓大家了解背後的機制。如果你換行換得太奇怪,大多編譯器的formatter都會幫你處理,也會跟你說哪裡有錯,不太需要擔心。至於要不要加分號,在JavaScript裡就變成了一種選項,有些人習慣、有些人不愛,大家也不要太糾結在這件小事上,讓formatter來為你處理就好。

=====

我們在條件判斷的單元裡看過==,但在實際上我們可能更常看到用===作為條件判斷。從先前的單元裡面我們看見其實JS好像不那麼要求變數的type(類別),這是因為JS內建一個自動的轉換機制,自動判斷類別。

舉例來說:

raw-image

==會允許自動型別轉換,string’3’和number3會因為這樣變得一樣,===則不允許。所以在使用===的情況下,兩者要typevalue都一樣,才會回傳true。這樣是比較嚴謹的。


目前看起來問題還不算太大,但還有很多例子這樣的操作顯得不太合理。

raw-image

就以第一個為例,假設我是想要判斷使用者是不是沒輸入資料(情況應該是’’空字串),但使用者輸入0也被算進來,就很奇怪。下面兩個例子更是尤其,而且除此之外還有更多非常離奇、難判斷的例子。因此普遍的建議是嚴謹一點,使用===來作判斷。

小結

今天我們談了非常多在JavaScript裡面常見的寫法以及某些特殊的規則,再加上前面幾單元的內容,希望比之前更了解JS程式碼的運作方式。例如,常見array後出現一長串連續map()filter()再加上anonymous arrow function,第一次看見還真的會被嚇到,今天開始你可以知道這是怎麼回事了。


明天,我們會討論JavaScript語法中備受關注的的內容,async和await語法。如同之前我們看到function hoisting的應用,JS程式碼不總是照著順序逐個運作的,有些情況下我們希望它不要這樣做。在最後這個單元中,我們將面對這個稍具挑戰的主題。


Resource

今日Codepen

連結

Credits

關於我

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

avatar-img
0會員
11內容數
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
HCY 71的沙龍 的其他內容
Scope(作用域) 不只是JavaScript,scope的概念在每個程式語言裡面都有,但每個語言scope運作邏輯多少有差異。 我們先來舉個例來了解scope: 隨著myFunction()執行,這段程式毫無疑問的console.log()出了myName這個變數的值’my name’
在開始討論這兩個陌生的名詞之前,我們先準備一份資料以便後續測試使用。 這筆資料是users的資料,可能是社群平台用來記錄使用者資料的格式。其中users是一個array(有[]包著),裡面包含了3個Object(有{}包著),每個Object內有許多的property-value配對(如id:
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。 我們可以逐個定義、宣告這些資料。
Scope(作用域) 不只是JavaScript,scope的概念在每個程式語言裡面都有,但每個語言scope運作邏輯多少有差異。 我們先來舉個例來了解scope: 隨著myFunction()執行,這段程式毫無疑問的console.log()出了myName這個變數的值’my name’
在開始討論這兩個陌生的名詞之前,我們先準備一份資料以便後續測試使用。 這筆資料是users的資料,可能是社群平台用來記錄使用者資料的格式。其中users是一個array(有[]包著),裡面包含了3個Object(有{}包著),每個Object內有許多的property-value配對(如id:
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。 我們可以逐個定義、宣告這些資料。
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
在這個章節中,我們介紹了HTML的基本概念,包括其作為結構化標記語言的特性、應用領域,以及主要使用者。這些知識為後續的深入學習和實踐奠定了基礎,幫助讀者了解HTML在現代網頁開發中的重要性。
先學習 HTML, CSS, JavaScript 基礎觀念, 再透過實作專案,慢慢熟悉不同的語法使用方式。
Thumbnail
JSDoc 全名是 JavaScript Documentation,顧名思義是為 JavaScript 所使用的 API 文件,在程式碼內透過註解的方式撰寫,運行後 JSDoc 會自動掃描註解內容,並生成一份網頁版的文件,對於沒有使用 Typescript 開發的專案,也
Thumbnail
此章節旨在介紹Java的基本語法、註解和變數的使用。透過學習,讀者將了解Java程式的基本結構、程式進入點的定義、如何撰寫單行和多行註解,以及如何宣告和初始化變數。
Thumbnail
你好,在下最近在學習開發web,學了html css js,也得出一些心得,由於網路上已有許多教學,所以我會著重在如何開發出to do List,以及解釋我寫的程式碼。相關的教學我會直接貼網址。如果我有什麼地方出錯,或者是可以寫得更好,歡迎在下方留言,討論。 首先先介紹我的開發環境: 我用了vs
Thumbnail
本章節旨在介紹TypeScript的基本語法,包括一般結構、程式進入點、註解以及變數的定義和賦值。這些知識將幫助讀者瞭解TypeScript的基本架構,並且可以開始使用TypeScript進行開發。
Thumbnail
TypeScript是一種由Microsoft開發和維護的開源編程語言。它是JavaScript的超集,主要擴展了JavaScript的語法,增加了靜態類型檢查和其他特性,使得開發大型應用程序更為方便和可靠。
Thumbnail
在網頁開發中,時間與日期的處理是重要且基礎的部分,本文將介紹 JavaScript 中的日期的處理方法,並提供範例程式來協助你理解。
Thumbnail
在剛開始寫 JavaScript 可能大多數的人不會特別意識到 JavaScript 的型別系統有什麼特別之處,我是在看完 Youtube 上 CS50 的課程,才理解到在不同的程式語言中,會因為語言的特性而有不同的系統,JavaScript 就是偏向比較特別的那一種。
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
在這個章節中,我們介紹了HTML的基本概念,包括其作為結構化標記語言的特性、應用領域,以及主要使用者。這些知識為後續的深入學習和實踐奠定了基礎,幫助讀者了解HTML在現代網頁開發中的重要性。
先學習 HTML, CSS, JavaScript 基礎觀念, 再透過實作專案,慢慢熟悉不同的語法使用方式。
Thumbnail
JSDoc 全名是 JavaScript Documentation,顧名思義是為 JavaScript 所使用的 API 文件,在程式碼內透過註解的方式撰寫,運行後 JSDoc 會自動掃描註解內容,並生成一份網頁版的文件,對於沒有使用 Typescript 開發的專案,也
Thumbnail
此章節旨在介紹Java的基本語法、註解和變數的使用。透過學習,讀者將了解Java程式的基本結構、程式進入點的定義、如何撰寫單行和多行註解,以及如何宣告和初始化變數。
Thumbnail
你好,在下最近在學習開發web,學了html css js,也得出一些心得,由於網路上已有許多教學,所以我會著重在如何開發出to do List,以及解釋我寫的程式碼。相關的教學我會直接貼網址。如果我有什麼地方出錯,或者是可以寫得更好,歡迎在下方留言,討論。 首先先介紹我的開發環境: 我用了vs
Thumbnail
本章節旨在介紹TypeScript的基本語法,包括一般結構、程式進入點、註解以及變數的定義和賦值。這些知識將幫助讀者瞭解TypeScript的基本架構,並且可以開始使用TypeScript進行開發。
Thumbnail
TypeScript是一種由Microsoft開發和維護的開源編程語言。它是JavaScript的超集,主要擴展了JavaScript的語法,增加了靜態類型檢查和其他特性,使得開發大型應用程序更為方便和可靠。
Thumbnail
在網頁開發中,時間與日期的處理是重要且基礎的部分,本文將介紹 JavaScript 中的日期的處理方法,並提供範例程式來協助你理解。
Thumbnail
在剛開始寫 JavaScript 可能大多數的人不會特別意識到 JavaScript 的型別系統有什麼特別之處,我是在看完 Youtube 上 CS50 的課程,才理解到在不同的程式語言中,會因為語言的特性而有不同的系統,JavaScript 就是偏向比較特別的那一種。