---
# System prepended metadata

title: JS(5/10) Day 19 五倍紅寶石(第八屆共筆)(2021/7/22)
tags: [JavaScript]

---

# JS(5/10) Day 19 五倍紅寶石(第八屆共筆)(2021/7/22)
## Event Loop：
JS 是單執行緒的程式，使用的資料結構為 stack 堆疊(後進後出)。
引擎：用來將我們寫的 code 轉成讓機器看得懂的語言。
JS 本身會有一個，而 WebAPI 也會有一個，每個 WebAPI 的引擎不同，最有名的是 chrome 的 V8 引擎。

有的函式如 setInterval 、 setTimeout 不是原本 JS 的引擎有的函式，執行時會先跑到 JS 的 stack 裡 ，接著馬上跑到 WebAPI 執行。
再來會跑到 Callback Queue 裡排隊，等到 stack 的東西執行完再執行 Queue 裡的函式。(一般的 Queue 稱作 Macrotask Queue)

其中有的函式會被歸類在 Microtask Queue 當中，他們有特權、是高等的 Queue，會比一般在 Queue 執行的 task 還更優先執行，甚至可以用函式把 Macrotask 變成 MicroTask。

細節:
[JS 原力覺醒 Day15 - Macrotask 與 MicroTask](https://ithelp.ithome.com.tw/articles/10222737)
[MDN:Using microtasks in JavaScript with queueMicrotask()](https://developer.mozilla.org/en-US/docs/Web/API/HTML_DOM_API/Microtask_guide)
## Debug：
有兩種用法：
1. console.log() 檢查
2. 先在程式碼內想要檢查的位置打debugger => 打開網頁檢查 => 切換到Source => 按F9 (Step) 檢查，或是點前面的行數插入中斷點(break point)也可以檢查。

## ES6 後出現的好用高階函式：
如果要重複使用就在函式外宣告函式。
不用的話就弄成匿名函式寫在函式裡面，執行完就不見了。
### map：
自動帶入陣列裡的元素，用**函式**對**每個元素**做事情，並**收集成一個新陣列**，回傳值 = 新陣列。
### forEach：
用**函式**對**每個元素**做事情，**不會變成新陣列**，回傳值 = undefined。
### filter：
過濾器，條件成立的就留下來，並**收集成一個新陣列**，回傳值 = 新陣列。
### reduce：
將陣列的每個元素傳到 callback 進行運算，並**回傳一個單一值**。
歸納、簡化，**一般用來加總數值**。
reduce( (累加值acc,目前值currentValue), 起始值 = 第一輪的 acc )
要注意 reduce 本身及他的 callback 都有**兩個**參數要帶入。
起始值沒給的話會直接將第一個數當成起始值，currentValue 會從第二個數開始拿。
**每一輪結束後的 return 值是下一輪的 累加值acc**。

## recursion遞迴：
自己呼叫自己，function 內部需設定好，不然會造成 overstack 的狀況。
[斐波那契數](https://zh.wikipedia.org/wiki/%E6%96%90%E6%B3%A2%E9%82%A3%E5%A5%91%E6%95%B0)就是一種遞迴，面試可能會考。(兔子生兔子題)

狀況題：
const a 執行完會出錯
=> 宣告常數一定要連同值一起給

---

###### tags: `JavaScript`