# Javascript 筆記 > Updated date:Alpha Camp 2-1 S3 [TOC] ## 迴圈系列 ### whlie迴圈(while、do while) :::info **while(條件式) {執行動作}** // 若符合條件則執行,每次執行前檢查條件 **do {執行動作} while(條件式)** // 先執行再檢查條件,若符合則再執行一次直到不符合為止 應用:[2-1 S1A5Q1週年慶摸彩](https://replit.com/@WuwachonWu/2-1-S1A5Q1-Zhou-Nian-Qing-Mo-Cai-Wan-Zheng-2#index.js/) 彩卷號碼產生並檢查有無重複 ::: ```javascript= const ticketPool = [] function generateTicket() { let ticket = '' // do..while迴圈,先做再檢查號碼有沒有重複,號碼重複再跑一遍do do { // 前兩碼英文字符 for (let i = 0; i < letterNum; i++) { ticket += String.fromCharCode(Math.floor(Math.random() * 26) + 65) } // 後四碼數字字符 ticket += Math.floor(Math.random() * (Math.pow(10, numberNum))).toString().padStart(numberNum, '0') } while (ticketPool.includes(ticket)) // 紀錄並回傳彩卷號碼 ticketPool.push(ticket) return ticket } // for...of迴圈,players陣列裡的物件逐項加入彩卷號碼 for (let i of players) { i.number = generateTicket() } ``` ### for迴圈(for、for in、for of) :::info **for (let i = 0; i < n; i++) {執行動作}** // 太常用不解釋 **for (let key in object) {執行動作}** // 依***物件***的key逐項執行,陣列和字串也可用 **for (let value of array) {執行動作}** // 依***陣列***的值逐項執行,物件和字串不能用 ::: ```javascript= let arr = [3, 5, 7] arr.foo = "hello" for (let i in arr) { console.log(i) // output: 0, 1, 2, foo } for (let i of arr) { console.log(i) // output: 3, 5, 7 } let obj = { a: 123, b: 456, c: 789 } for (let i in obj) { console.log(i) // output: a, b, c } let str = 'abcdefg' for (let i in str) { console.log(i) // output: 0, 1, 2, 3, 4, 5, 6 } ``` ### 陣列可用的其他迴圈 (forEach、map、filter) :::info **陣列.forEach(*function*)**:遍歷每個元素,可改變原陣列的值 ex: arr.forEach((元素,index,arr) => {執行動作}) **陣列.map(*function*)**:遍歷每個元素,不改變原陣列,需指定新陣列接回傳的值 ex: let newArr = arr.map((元素,index,arr) => {執行動作}) **陣列.filter(*function*)**:遍歷每個元素,不改變原陣列,需指定新陣列接回傳 true 時的值 ex: let newArr = arr.filter((元素,index,arr) => {條件}) ::: ```javascript= let arr1 = [1, 2, 3, 4, 5] // forEach完可能會改變原陣列 let arr2 = [1, 2, 3, 4, 5] // map、filter不改變原陣列 // ForEach arr1.forEach((num, index) => { return arr1[index] = num * 2; }) console.log(arr1) // [2, 4, 6, 8, 10] // Map let arrMap = arr2.map(num => { return num * 2; }) console.log(arr2) // [1, 2, 3, 4, 5] console.log(arrMap) // [2, 4, 6, 8, 10] // Filter let arrFilter = arr2.filter(num => { return num > 2 }) console.log(arr2) // [1, 2, 3, 4, 5] console.log(arrFilter) // [3, 4, 5] // Map疊加Filter let arrMapFilter = arr2.map(num => num * 2).filter(num => num > 5) console.log(arrMapFilter) // [6, 8, 10] ``` ## Array 陣列 ### 頭/尾 - 插入/刪除(shift/unshift、pop/push) ![](https://i.imgur.com/miNE3QE.png) :::info * **arr.shift()** * **arr.unshift(element1[, ...[, elementN]])** * **arr.pop()** * **arr.push(element1[, ...[, elementN]])** ::: ```javascript= let arr = [0, 1, 2, 3, 4, 5] arr.pop() // remote last element console.log(arr) // expected output: [0, 1, 2, 3, 4] arr.shift() //remote first element console.log(arr) // expected output: [1, 2, 3, 4] arr.push('a', 'b') // add element to the end of array console.log(arr) // expected output: [1, 2, 3, 4, 'a', 'b'] arr.unshift(['red', 'yellow'], 'green') // add element to the beginning of array console.log(arr) // expected output: [['red', 'yellow'], 'green', 1, 2, 3, 4, 'a', 'b'] ``` ### 中間 - 插入/刪除(splice) :::info **arr.splice(start, deleteCount, item1, item2, itemN)** ::: ```javascript= const months = ['Jan', 'Feb', 'March', 'April', 'May']; months.splice(2, 1, 'yellow', 5); // remove 1 element and add elements at index 2 console.log(months); // expected output: Array ['Jan', 'Feb', 'yellow', 5, 'April', 'May'] ``` ### 擷取某一片段不改變原Array(slice) :::info **arr.slice(start, end)** #包頭不包尾 ::: ```javascript= const months = ['Jan', 'Feb', 'March', 'April', 'May']; months.slice(1, 3); // copy a potion from index 1 to (3 - 1) console.log(months); // 完全不影響原來的array // expected output: ['Jan', 'Feb', 'March', 'April', 'May'] console.log(months.slice(1, 3)); // expected output: ['Feb', 'March] ``` ### 從尾巴添加新Array元素不改變原Array(concat) :::info **arr.concat((value1[, value2[, ...[, valueN]]]))** 產生新陣列:合併兩個陣列或直接添加元素到原陣列,槽狀陣列合併後可保留槽狀結構 !須注意 [ ] ::: ```javascript= const num1 = [1, 'a']; const num2 = [2, [3]]; const numsA = num1.concat(num2); const numsB = num1.concat(2, [3]); const numsC = num1.concat([2, [3]]) console.log(numsA); // expected output: [1, 'a', 2, [3]] console.log(numsB); // expected output: [1, 'a', 2, 3] console.log(numsC); // expected output: [1, 'a', 2, [3]] num2[1].push(4); // add 4 to the end of index 1 of num2 console.log(numsA); // expected output: [1, 'a', 2, [3, 4]] numsB.push(4); // add 4 to the end of numsB console.log(numsB); // expected output: [1, 'a', 2, 3, 4] numsC[3].push(4); // add 4 to the end of index 3 of numsC console.log(numsC); // expected output: [1, 'a', 2, [3, 4]] ``` ## Key-value 結構:物件 Object **Key-Value pair** ![](https://i.imgur.com/h15Tjb0.png) ### 儲存不同格式的資料 :::info 可儲存基本值、array、object、甚至 function ```javascript= const myPhone = { name: 'myPhone', // String price: 14999, // Number features: ['long battery life', 'AI camera'], // Array hardware: { // Object ram: '8GB', storage: '64GB', } } ``` ::: **點記法 (dot notation)** / **括號記法 (bracket notation)** 賦值 :::info 括號記法(bracket notation) : ['keys'] 點記法(dot notation) : .keys ::: ```javascript= myPhone['hardware'].system = 'Andriod' console.log(myPhone.hardware) // { ram: '8GB', storage: '64GB', system: 'Andriod' } console.log(myPhone['hardware']) // { ram: '8GB', storage: '64GB', system: 'Andriod' } ``` ### for-in 用法 :::info **for (key in object) { 動作(ex:console.log) }** 順序檢查物件key-value pair的key,指定同時做的動作 ::: ```javascript= const performance = { mike: 200, bernard: 500, cathy: undefined, jane: 300 } let sum = 0 for (let info in performance) { if (typeof(performance[info]) === 'number') { sum += performance[info] } else { console.log(`${info}` 沒交資料) } } console.log(`目前總業績:${sum}) // outpute: cathy沒交資料 // output: 目前總業績:1000 ``` ### 取出object資料並成為新array :::info 取出所有的 key 值 - Object.keys() 取出所有的 value - Object.values() 取出所有的 pair - Object.entries() ::: ```javascript= const performance = { mike: 200, bernard: 500, cathy: undefined, jane: 300 } console.log(Object.keys(performance)) // ['mike', 'bernard', 'cathy', 'jane'] console.log(Object.values(performance)) // [200, 500, undefined, 300] console.log(Object.entries(performance)) // [ // ['mike', 200], // ['bernard', 500], // ['cathy', undefined], // ['jane', 300] // ] ``` ## 字串 ### 切割片段(slice、substring、substr) :::info str.slice(start, end) // 接受負數 str.substring(start, end) // 不接受負數 str.substr(start, length) // 接受負數 ::: ```javascript= let str = "Apple, Banana, Kiwi"; console.log(str.slice(-12, 13)); // Banana console.log(str.substring(7, 13)) // Banana console.log(str.substr(-12, 6)) // Banana ``` ### 斷句並建立Array(split) :::info **str.split("以某元素斷句")** ex: str.split(".") // 以句點斷句 str.split(" ") // 以空白斷句 ::: ```javascript= let text = "Please visit Microsoft and Microsoft!"; let newText = text.split(" "); console.log(newText); // ["Please", "visit", "Microsoft", "and", "Microsoft!"] ``` ### 置換字詞(replace、toUpperCase、toLowerCase) :::info **replace:** str.replace("原字詞", "新字詞") // 置換**第一個**原字詞,大小寫需一致 str.replace(/原字詞/i, "新字詞") // 置換**第一個**原字詞,大小寫不需一致 str.replace(/原字詞/g, "新字詞") // 置換**所有的**原字詞 **大小寫置換:** str.toUpperCase() // 全部字詞變成大寫 str.toLowerCase() // 全部字詞變成小寫 ::: ### 移除兩端空白(trim) :::info str.trim() ::: ### 增加填滿字串長度(padStart、padEnd) :::info str.padStart(總長度, 用什麼元素填滿開頭) str.padEnd(總長度, 用什麼元素填滿尾端) ::: ### 字串轉數字/數字轉字串((+)、(*1)/toString) :::info 數字.toString() // 數字轉字串 +(字串) // 字串轉數字方法一 (字串) * 1 // 字串轉數字方法二 ::: ### 從unicode找英文字符(fromCharCode) :::info **String.fromCharCode()** // 不只用來找英文字符,但用來找連續大小寫英文字符特別方便 **大寫英文字符unicode從65開始** console.log(String.fromCharCode(65)) // output:A **小寫英文字符unicode從97開始** console.log(String.fromCharCode(97)) // output:a ::: ## 函式function :::info **// 把需要重複執行程式封裝進函式中** function 函式名稱(參數1, 參數2) { 執行動作 } **// 提供引數並呼叫函式,使函式依引數執行 函式名稱(引數1, 引數2)** ex: [2-1 S1A5Q1 週年慶摸彩](https://replit.com/@WuwachonWu/2-1-S1A5Q1-Zhou-Nian-Qing-Mo-Cai-Wan-Zheng-2#index.js/) ::: ### 用箭頭函式簡化再簡化函式用法 :::info **// 省略function和程式名稱** (參數1, 參數2, …, 參數N) => { 執行動作 } **// 執行動作中如果只有一行return + 表示式,return和大括號可省略** (參數1, 參數2, …, 參數N) => 表示式; // 等相同(參數1, 參數2, …, 參數N) => { return 表示式; } **只有一個參數時,括號可省略** 單一參數 => { 陳述式; } // 等同於 (單一參數) => { 陳述式; } **//若無參數,就一定要加括號** () => { statements } :::