# 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
}
```
概念圖:

非同步的方程式可以變成類似同步,也就是等待它:
```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/) 查詢