# JavaScript 筆記 > 嗯,顧名思義,這是一份關於 JavaScript 的筆記 > 遞迴連結:https://hackmd.io/@StarHuey/r1vRwtPpi 前言.什麼是 JavaScript? --- 它跟 Java 其實沒什麼關係 是一款非常高階,內建功能非常多的語言 通常都是線上的網頁使用! 在終端機運行 Run in Terminals --- 可以使用 Node.js 來達到在主機直接運行 code 的目的 1. 下載並安裝 2. 打開 VS Code 3. 新增終端機 4. 打指令 `node <檔案名稱>.js` 通用語法 Common Syntax --- 有些東西可以去翻我的 [C++ 筆記](https://slides.com/star_huey/cpp_note/) 就找的到,例如: 1. 運算元 2. if else 3. switch case 應該還有,但是我記不得 函數 Function --- 在 JavaScript 中,函數是一種型別,但這有點複雜,之後會提 宣告一個函數: ```js function myFunc() { // 做一些事 return /* 東西 */; } ``` 在 JavaScript 中,**不用宣告回傳型別**,但是還是建議函數要回傳固定型別的東西 另外使用 `console.log( /* 內容 */ );` 可以把內容列印在 debug console,會自動換行 變數 Variable --- 在 JavaScript 中,宣告變數**無須宣告型別**。這點很方便,但還是不要硬轉換型別比較好 使用 var 宣告一個存在於**函數範圍內**的變數: ```js var t; var myNumber = 10; var anotherNumber = 94.87; var myString = "wow"; var myArray = [ "apple", "banana", "grapes" ]; ``` 使用 let 宣告一個存在於**該層大括號內**的變數: ```js if (true) { let test = 0; // 這裡可以存取 test } // 這裡就沒有 test 了 ``` 另外,變數也可以被宣告為常數: ```js const myNumber = 2023; ``` 字串 String --- 在 JavaScript 中,字串**可以用單引號或是雙引號,兩者等價**: ```js var str = "Hello, World!"; var str2 = 'Hello, World!'; ``` 但是單引號內如果要寫「單引號」這個字元,就必須寫成 `\'` 了 另外字串有一些基本函數,很多都跟 C++ 一樣: ```js var str = "Hello, World!"; // 宣告一個字串 console.log(str[7]); // 第四個字,也就是 'W' console.log( str.slice(7, 12) ); // 切下 3 ~ 7 (不含 7),也就是 "World" console.log( str.startsWith("Hello") ); // 是否以 "Hello" 開頭,為 true // 相反地,endsWith(...) 代表是否以……結尾 console.log( str.includes("!") ); // 是否包含 "!",會是 true console.log( str.replace("World", "Rick")); // 把 World 換成 Rick,變成 "Hello, Rick!" console.log( str.toUpperCase() ); // 換成大寫,相反地,toLowerCase() 可以換成小寫 console.log( str.split(' ') ); // 以空格分開,轉換成陣列,為 [ "Hello,", "World!" ] ``` 另外,有一種很好用的字串表示法,就是 Tab 上面那個符號 \[ \` \],可以嵌入變數: ```js var age = 15; console.log(`I'm ${age} years old.`) // 在 ` ` 中使用 ${...} 嵌入變數,結果為 "I'm 15 years old." ``` 陣列 Array --- JavaScript 的陣列跟 C++ 中的 std::vector 很像: ```js var fruits = [ "apple", "banana", "papaya" ]; // 宣告一個陣列 fruits.push("grapes"); // 新增 grapes 到陣列尾 console.log(fruits); // [ "apple", "banana", "papaya", "grapes" ] fruits.splice(2, 1); // 從第二項開始刪除一項 console.log(fruits); // [ "apple", "banana", "grapes" ] fruits.reverse(); // 順序反轉 console.log(fruits); // [ "grapes", "banana", "apple" ] console.log( fruits.includes("banana") ); // true console.log( fruits.join(" -- ") ); // 以 " -- " 作為分隔,轉為字串,結果是 grapes -- banana -- apple ``` 物件 Object --- 看看範例: ```js var app = { "name": "discord", "usage": "unknown" } console.log( app.name ); console.log( app["name"] ); // 兩者是相同的,就是 "discord" console.log(app.usage); // unknown app.usage = "communicate with others"; console.log(app.usage); // "communicate with others" ``` 代表 `key: value` 雖然上面的例子有,但 `key` 其實**不一定要加引號**: ```js var app = { name: "discord", usage: "unknown" } ``` JSON --- 有點像是 C++ 的 struct,但不用先宣告即可自由存資料,可以放前面提到過的東西! ```js var person = { "name": "Jack". "friends": [ "Ann", "John", "Bob", "Charlie" ], "height": 165, "weight": 50, "activityNow": { "name": "jogging", "duration": 30 * 60 * 1000 } } ``` JSON 可以存成檔案(<檔案名稱>.json),JSON 檔案中的 `key` 一定要加引號 同步與非同步 sync & async --- JavaScript 有神奇的非同步函數,寫法是: ```js async function myAsyncFunc(...) { // do something here } ``` 概念圖: ![](https://i.imgur.com/zlLXdo2.png) 非同步的方程式可以變成類似同步,也就是等待它: ```js await myAsyncFunc(); ``` 註:`await` 只能在非同步函數中使用 函數作為物件 function as object --- 之前有提過,函數其實是物件的一種: ```js var myFunc = function (...) { // do something }; // 呼叫 myFunc myFunc(...); ``` 大部分時候也可以寫成這樣,也就是 arrow 形式: ```js var syntax = ((...) => {}); var myFunc = ((...) => { // do somthing }); ``` 那既然是物件,就可以當作常數呼叫: ```js ((...) => {})(...); ((...) => { // do something })(...); ``` 這樣,我們就可以指派一段非同步程式碼: ```js (async () => { // do something })(); ``` 模組包 Mod Packs --- Node.js 有很多模組可以用,這邊會介紹一些常用的 在命令列打: ```shell npm install <模組名稱> ``` 就可以安裝了 安裝後資料夾中應該會出現一個 `node_modules` 資料夾和 `package.json` & `package_lock.json` `node_modules` 是模組包所需的檔案,`package.json` & `package_lock.json` 是列出你安裝的模組們 常用的有: 1. `fs`: 檔案讀寫,內建 2. `stdio`: 比較方便的輸入輸出 3. `robotjs`: 用機器人操作電腦,很酷 4. `discord.js`: 寫 discord 機器人 模組的用法可以到 [Npm 官網](https://www.npmjs.com/) 查詢