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

0會員
11內容數
留言0
查看全部
發表第一個留言支持創作者!
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
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
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
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
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 就是偏向比較特別的那一種。