2024 JavaScript 工程師養成直播班 - 每日任務
はじめに
Atomic Habits: Author James Clear mentioned that by improving just 1% every day, you can grow 37 times over the course of a year. This concept emphasizes the power of small, consistent changes—much like how atoms accumulate to create significant impact. 🚀💡
目前參加了 六角學院 - 2024 JavaScript 工程師養成直播班
,學院每個平日會有 JS 每日任務。
其他還有 ↓
每日任務列表
since 2024-09-30
Day 01 ~ Day 10
Day 01: 變數自我介紹
Day 02: 型別與宣告
Day 03: 小駝峰式命名
Day 04: 型別陷阱題
Day 05: 賦值運算子與傳參考概念
Day 06: 比較運算子
Day 07: 邏輯運算子
Day 08: 運算子大雜燴
Day 09: if、else if、else 練習一
Day 10: if、else if、else 練習二
===
Day 11 ~ Day 20
Day 11: 陣列操作
Day 12: 陣列操作應用
Day 13: 物件操作
Day 14: 物件取值
Day 15: 陣列物件整合操作應用
Day 16: 函式觀念一 console.log 與 呼叫
Day 17: 函式觀念二 呼叫與優化
Day 18: 函式觀念三 & 費波那契數列
Day 19: 函式觀念四 這裡重點是 return
會中斷函式執行的觀念
Day 20: 函式與陣列物件整合運用
===
Day 21 ~ Day 30
Day 21: DOM 選擇器 練習使用 document.querySelector
Day 22: textContent 練習使用 textContent
及 變數
來修改 html
的內容
Day 23: innerHTML 練習使用 innerHTML
修改 HTML
,自己加碼練習了 .map()
跟 .join()
Day 24: 取得、設定元素屬性 學習 getAttribute
及 setAttribute
Day 25: forEach 練習使用 forEach
搭配 if
以及 .push()
Day 26: addEventListener 事件監聽 DOM 選擇器
搭配事件監聽做一個小小的點擊 +1 的小功能。
Day 27: 表單取值觀念 練習了表單取值的方法,input
和 select
還有按鈕的監聽。以及 .value
與 .getAttribute
的區別
Day 28: axios 串接練習 練習使用 axios 套件取得外部 JSON 資料,並且取值渲染到畫面上
Day 29: API 資料渲染 延續昨天的練習,將資料渲染到畫面上,除了複習 axios.get
加練習了 arrow function
和 解構賦值
Day 30: HTTP 狀態碼 學習解讀 HTTP 狀態碼代表的意思
===
Day 31 ~ Day 40
Day 31: AJAX 非同步觀念 理解 AJAX 的非同步觀念
Day 32: 函式設計處理非同步 延續昨天的非同步觀念,才能正確的取得資料並渲染到畫面上。
Day 33: 常見的 POST 請求 複習 Content-type
的區別
Day 34: C3.js 使用練習 學習使用 c3.js
製作圖表,今天也改使用 codesandbox
來寫作業,研究了一下基本的功能,搭配 GPT
的教學。
Day 35:
Day 36:
Day 37:
Day 38:
Day 39:
Day 40:
主線任務的回顧
第一週主線任務
開始 JS 課程啦~雖然趕在開學前把影音課程都二刷了遍,
可是只有輸入腦子說我懂了,但手說沒學會。
果然在寫作業的時候才會發現自己基礎的缺乏,
邊把筆記更新起來邊重新複習一次。
第二週主線任務
第二週開始了一些基礎觀念的釐清及陷阱題,以及一些 if
的應用與邏輯判斷式的練習,
題目有:
- BMI 的體重判斷
- 消費金額與 VIP 會員的滿額贈
- 貪心國的所得稅稅收計算器
- 剪刀石頭布
最好玩的就是最後一題的剪刀石頭布了,每日刷題 - Day 14 有更詳細的筆記
第三週主線任務
第三週主要是環繞在陣列與物件的熟悉以及取值的練習
其中的第七題練習了一下.map()
跟 .forEach()
兩個方法(還有arrow function
):
有一位客戶於平日將所有房型都訂了一間房,請計算他共花了多少錢?
- JSON 資料
let roomDetail = {
"success": true,
"items": [
{
"id": "3Elqe8kfMxdZv5xFLV4OUeN6jhmxIvQSTyj4eTgIowfIRvF4rerA2Nuegzc2Rgwu",
"imageUrl": "https:\/\/images.unsplash.com\/photo-1551776235-dde6d482980b?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=2134&q=80",
"normalDayPrice": 1380,
"holidayPrice": 1500,
"name": "Single Room"
},...
}
- 這裡用到
.map()
來抓取指定陣列中的所有值,組成一個新陣列
let totalNormalDayPrices = 0;
//先抓出陣列中平日房型的金額
let normalPriceAry = roomDetail.items.map(
normalPrice => normalPrice.normalDayPrice);
//console.log(normalPriceAry); 先檢查陣列有沒有正確抓取
- 最後使用
.forEach
來加總陣列裡面全部的數值
//加總陣列裡面的全部金額
normalPriceAry.forEach(
totalPrice => totalNormalDayPrices += totalPrice);
console.log(`這位客戶共花了 ${totalNormalDayPrices} 元`);
第四週主線任務
第四週任務是三階段 BMI 健康指標計算器 Kata 練習,並且要取得 20 min 以下的時間。
『Kata』是取自日文『形 (かた)』
意指表演藝術、武術等標準動作或方法
(芸能や武道などで、規範となる動作・方式)。
code kata 則用來表示刻意練習某一段 code ,以此習得技能。
整個任務主要學習的重點是 小步驗證 , 將程式拆解成小單位,並且每步都確實驗證可行性
- 第一階段是練習使用
if
方法if (bmi < 18.5){ console.log('您的體重過輕'); }else if(bmi >= 18.5 && bmi < 24) { console.log('您的體重正常'); },...
- 第二階段是練習
object
, 並且取值的觀念- 建立物件,將資料放在裡面
const bmiData = { 'overThin': { state: '過輕', color: '藍色' }, 'normal': { state: '正常', color: '紅色' },... }
- 輸出有共同的文字我們只需要套用物件的值,所以這裡使用樣版字面值搭配取值
function bmiStates(fettle){ console.log(`您的體重${bmiData[fettle].state}, 健康指數為${bmiData[fettle].color}`); };
- 由於
fettle
有不同的邏輯條件,把原本console
改為bmiData
的不同屬性
if (bmi < 18.5){ bmiStates('overThin'); }else if(bmi >= 18.5 && bmi < 24) { bmiStates('normal'); },...
- 第三階段是綜合的練習:需要建立一個陣列來儲存計算的資料,並會使用到抓取陣列最後一筆資料
- 建立一個空陣列要用來放儲存資料的
let bmiHistoryData = [];
- 宣告一個空物件,賦予計算出來的資料,並且將資料增加儲存到
bmiHistoryData
function addData(bmi, state){ let obj = {}; obj.bmi = bmi; obj.state = state; bmiHistoryData.push(obj); // console.log(bmiHistoryData); }
- 這段我第一次看老師做一遍我腦子就亂了,後面小步拆解來看每一段的目的並且理順流程,
最終是要輸出
『您總共計算 3 次 BMI 紀錄,最後一次 BMI 指數為 26.83 ,體重過重!健康指數為澄色!』這一段文字,
所以再反推需要取得哪一些值,用這樣的思考方式比較不會被繞亂
function showHistoryData(){ const totalNum = bmiHistoryData.length; //計算陣列長度,可以得到總共計算的次數 const lastNum = totalNum -1; //我們要取得最後一筆陣列的資料,如果宣告的次數為 1 ,這裡 1 - 1 = 0 ,就會抓取第 0 筆的資料 const lastState = bmiHistoryData[lastNum].state; //取值 console.log(` 您總共計算 ${totalNum} 次 BMI 紀錄, 最後一次 BMI 指數為 ${bmiHistoryData[lastNum].bmi}, 體重 ${bmiData[lastState].state}! 健康指數為${bmiData[lastState].color}!`); }
第五週主線任務 - 小魔王
要將前面學到的知識正式的使用在網站上啦啦啦啦啦啦!!
這週任務直接是另一個世界!!看到畫面的當下腦子是直接當機的,我是誰我在哪我要幹嘛這是我會的嗎我有辦法當前端嗎?最後完全不知道要從哪邊開始,就先去看助教的直播回放了。
把任務拆解後其實都是前面學過的知識,再一步一步的小步驗證跟執行,不外乎就是
- 取得
DOM
- 監聽監一監
- 取得
data
的資料再渲染回畫面
對我比較有難度的是搜尋並顯示畫面那一個階段,以及不熟悉要用 function
將程式包起來的。(因為作業都是直接寫上去)
平時作業
//平常小作業的練習 code 都不長,而且也沒有另外呼叫的需求
regionSearch.addEventListener("change", function () {
let filterResult = [];
data.forEach(function (item) {
if (!regionSearch.value) {
filterResult.push(item);
} else if (item.area === regionSearch.value) {
filterResult.push(item);
}
renderData(filterResult);
});
console.log(filterResult);
});
實務上
regionSearch.addEventListener("change", function () {
filterData(); //會再回來呼叫
});
function filterData() {
let filterResult = [];
data.forEach(function (item) {
if (!regionSearch.value) {
filterResult.push(item);
} else if (item.area === regionSearch.value) {
filterResult.push(item);
}
renderData(filterResult);
});
console.log(filterResult);
};
沒有什麼太難的邏輯題,完全是有沒有熟悉使用 Mathod 們以及腦子有沒有轉過來而已。慢慢養成工程師腦~加油呀自己!!
第六週主線任務
第六週相對上週簡單很多,主要是 axios
的學習與使用,上週是直接把 data
寫在 JavaScript 裡面,這週就學習如何串接 API 後取得資料並渲染在畫面上。
因為取得及渲染在上週做了,所以只要拿上週的來修改就可以了。
作業有分為 lv1
和 lv2
難度,資料是完全一樣的,唯一不同的是 lv2
有再用 object
包了一層,所以取值的方式就要再調整,基本上觀念正確的話兩個等級是一樣的。
這裡也是平常習慣直接把 url 寫在裡面,助教說可以把 url 另外宣告方便管理。
let actualData = [];
const url =
"https://raw.githubusercontent.com/hexschool/js-training/main/travelApi.json";
axios
.get(url)
.then(({ data }) => {
actualData = data.data;
renderData(actualData);
})
.catch(function (error) {
console.log(error.message);
});
另外也學到了 解構賦值
及練習 arrow function
的使用,後面 React
框架會大量使用,用力習慣起來。
AJAX POST 小節任務
第六週主線是練習 axios
的 get
請求取得資料,而小節任務是練習 post
請求發送資料給伺服器做驗證。
這算是一個額外的任務沒有算在主線作業裡面,但這個蠻重要的所以加做了這個小節任務。
除了跟老師做了一次註冊的練習,這個小節任務再做一次註冊跟登入帳號,就算如此感覺還是不夠熟悉的感覺ww
一樣重要的是任務拆解,拆解完其實就會變簡單許多:
這裡先做註冊、再做登入,步驟都一樣
- 取得表單的
DOM
const accountLogin = document.querySelector('.account-login');
const passwordLogin = document.querySelector('.password-login');
const logInBtn = document.querySelector('.send-login');
- 監聽按鍵的
click
動作
logInBtn.addEventListener('click', () =>{
callLogIn();
})
- 建立一個新物件,將取得輸入的值依
API
的資料格式存入
let logInObj = {};
logInObj.email = accountLogin.value;
logInObj.password = passwordLogin.value;
console.log(logInObj);
- 寫一個
function
串接API
,並且發送post
請求
- Method:
post
- URL:
https://..../signin
- data:
{email: 'abc@gmail.com', password: '123'}
axios
.post(logUrl, logInObj)
.then(({ data }) => {
console.log(data)
})
.catch(({ error }) => {
console.log(error);
});
- 渲染驗證資訊回畫面:『填寫正確資訊』、『登入成功』、『登入失敗』
if(accountLogin.value === '' || passwordLogin.value === ''){
logInMessage.textContent = '請輸入正確資訊'
}
axios
.post(logUrl, logInObj)
.then(({ data }) => {
if(data.message === '登入成功'){
logInMessage.textContent = '登入成功';
}
})
.catch(({ error }) => {
logInMessage.textContent = '登入失敗,請檢查帳號或密碼';
console.log(error);
});
- 在輸入後清空輸入值
accountLogin.value = '';
passwordLogin.value = '';
還不太熟練 .catch
的部份,以及錯誤驗證的資訊,後面有機會再來研究,
這裡學完並且接著寫作業並且還刷了兩題 codewars
已經把腦汁榨乾了。
Discussion