- JavaScript 語法
- 基本
- 變數宣告 (Variable Declarations)
- Class
- Get and Set
- JSDoc 註解
- Funtion
- 箭頭函數
- DOM | Windows
- Logical operators
- 基本邏輯運算子Logical operators( 、 、 )
- (反轉運算子)
- || (OR)
- && (AND)
- isOkay ? A : B (Ternary Operator 三元運算)
- ?.
- Array
- push()
- splice()
- shift()
- map()
- findIndex()
- sort()
- join()
- filter()
- String
- 文字模板 (Template literals)
- split()
- trim()
- Object
- 物件解構 (Object Destructuring)
- 合併物件
- 物件與鍵值 (Object Properties)
- 更改物件屬性 (Modifying Object Properties)
- 解構賦值 (Destructuring Assignment)
- 展開物件 (Spread Syntax for Objects)
- 陣列解構 (Array Destructuring)
- 交換變數值 (Swapping Variables)
- JSON
- Document Object Model
- ES Module
- export 導出
- export default 導出
- wait
- 其他
- TypeScript (升級成強型別語言) (待編輯)
- Browser Storage
JavaScript 語法
JavaScript 是一種 object-oriented (物件導向)、prototype-based (原型導向)、multi-paradigm (多範式) 語言。
其中 dynamically-typed (動態類型),這意味著變量的型別在執行期間確定,並且可以根據賦值變動,以及屬於 弱型別 (weakly typed) 語言,這意味著型別之間的轉換較為寬容,語言會自動將不同型別的數據進行隱式轉換,雖然這樣提高了靈活性,但也可能帶來錯誤。
JavaScript 同時是 event-driven (事件驅動) 和 single-threaded (單線程),透過事件循環機制實現高效的異步處理,讓它在處理複雜的 Web development (網頁開發) 任務時十分靈活
- 此筆記提供快速複習現有的語法架構 -2025
基本
(default)
預設為 Public(公共)
#
表示 Private(私有)
static
方法為 靜態方法,屬於 class 本身,與實例(Instance)無關
class MyClass {
// 靜態方法
static staticMethod() {
return "This is a static method";
}
}
const instance = new MyClass(); //實例化
console.log(instance.staticMethod); // undefined
console.log(MyClass.staticMethod()); // successful
變數宣告 (Variable Declarations)
var
:宣告一個全域或函數作用域的變數,可任意更改其值。let
:宣告一個區塊作用域 (Block Scope) 的變數,可任意更改其值。const
:宣告一個區塊作用域的不可變常數,值不可重新賦值。
Class
建構函數 (Constructor)
class Rectangle {
constructor(height, width) {
this.height = height;
this.width = width;
}
}
Get and Set
class MyClass {
let value
get value() {
return this._value;
}
set value(newValue) {
this._value = newValue;
}
}
JSDoc 註解
/** * @typedef {Object} User * @property {number} id - 使用者的 ID * @property {string} name - 使用者的名稱 * @property {boolean} isAdmin - 是否為管理員 */ /** * @param {User} user - 使用者物件 * @returns {} - 返回 */ function printUser(user) { console.log(`ID: ${user.id}, Name: ${user.name}, Admin: ${user.isAdmin}`); }
Funtion
箭頭函數
// () => {}
const example1 = () => {
console.log("Hello");
}; //無回傳值 void
// () => ()
const example2 = () => (
"Hello"
); //有回傳值 string
DOM | Windows
window.addEventListener
window.scrollY
document.getElementById
const div = document.getElementById('myDiv');
document.querySelector(”className”).add(”what”)
document.querySelector(”className”).remove(”what”)
對class的操作
const div = document.getElementById('myDiv');
div.classList.remove('what')
div.classList.add('what');
Logical operators
基本邏輯運算子Logical operators( ||
、 &&
、 !
)
!
(反轉運算子)
const object = !true; // false
|| (OR)
- 如果左側為 truthy,直接返回左側的值。
- 如果左側為 falsy,返回右側的值。
console.log(true || false); // true
console.log(false || "hello"); // "hello"
&& (AND)
- 如果左側為 falsy,直接返回左側的值。
- 如果左側為 truthy,返回右側的值。
console.log(false && "hello"); // false console.log(true && "world"); // "world"
isOkay ? A : B (Ternary Operator 三元運算)
判斷 isOkay
布林值 如果是 true 回傳 A
否則 回傳 B
?.
當值不存在時,給出undefine 而不引發程式錯誤
const obj = { A: "Hello" };
console.log( obj?.B ); // 输出 undefine
Array
push()
let arr = [1, 2, 3];
arr.push(4) //資料結構堆疊
console.log(arr); // 結果 [1, 2, 3, 4]
//arr.splice(索引值) //只保留到索引值位子
//arr.splice(索引值,刪除數) //只保留到索引值位子,往後刪除幾個
//arr.splice(索引值,刪除數,插入值) //只保留到索引值位子,往後刪除幾個,在索引值插入值
arr.splice(2, 0, 'c'); // 在索引 2 處插入 'c',不刪除任何元素
console.log(arr); // 結果 ['a', 'b', 'c', 'd']
//arr.shift()刪除開頭
arr.shift()
console.log(arr); // 結果 ['b', 'c', 'd']
arr.pop(); // 刪除陣列最後一個元素
console.log(arr); // [1, 2, 3]
splice()
arr.splice(索引值,刪除數,插入值,...) //從哪個位置開始操作,往後刪除幾個,在索引值插入值
let arr = ['a', 'b', 'd'];
arr.splice(2, 0, 'c'); // 在索引 2 處插入 'c'
console.log(arr); // ['a', 'b', 'c', 'd']
let arr = ['a', 'b', 'c', 'd'];
arr.splice(2, 1); // 刪除索引 2 的元素 ('c')
console.log(arr); // ['a', 'b', 'd']
shift()
let arr = ['a', 'b', 'c', 'd'];
arr.shift(); // 刪除陣列的第一個元素 ('a')
console.log(arr); // ['b', 'c', 'd']
map()
陣列迴圈輸出
const array = [1, 2, 3]
array.map((item, index) => {
console.log(item, index)
})
// console.log...
// 1 0
// 2 1
// 3 2
findIndex()
回應找到陣列索引值,沒找到回傳-1
const arr = ["A", "B", "C"];
const result = arr.findIndex((n) => {
return n === "C";
});
console.log(result); //2
sort()
對陣列進行排列
result.sort((a, b) => {
return new Date(a.date) - new Date(b.date); // 升序排序
});
join()
const fruits = ["Apple", "Banana", "Cherry"];
const result = fruits.join();
console.log(result); // Apple,Banana,Cherry
filter()
const array1 = ["A", "C"];
const array2 = ["A", "B", "C"];
array2.filter(item => !array1.includes(item)); // ["B"]
arr.push(data); arr.pop(); arr.shift(); arr.concat() arr.findIndex()
String
文字模板 (Template literals)
- *
*
${ object }``
<p>{`Logged In: ${user.loggedIn}`}</p>
split()
const text = "A/B/C" text.split("/") //輸出陣列 ["A","B","C"]
trim()
console.log(" 消除前後空格 ".trim())
Object
物件解構 (Object Destructuring)
物件解構允許從物件中提取出值並賦給變數。這樣可以讓代碼更簡潔,減少繁瑣的存取操作。
const person = { name: 'Tom', age: 20 };
// 物件解構,將物件的屬性賦值給變數
const { name, age } = person;
console.log(name); // 输出 'Tom'
console.log(age); // 输出 20
合併物件
使用解構語法可以合併兩個物件
const person = { name: 'Tom', age: 20 };
const add = { ...person, position: "staff" };
console.log(add); // 输出 { name: 'Tom', age: 20 , position: "staff" }
物件與鍵值 (Object Properties)
可以通過兩種方式來存取物件的鍵值:
- 使用點語法(Dot Notation)
- 使用中括號語法(Bracket Notation)
const object = {
key: "value",
key2: function () {
console.log("Hello");
},
};
console.log(object.key); // 输出 "value"
console.log(object["key"]); // 输出 "value"
console.log(object.key2); // 输出 function 內容
更改物件屬性 (Modifying Object Properties)
可以直接通過點語法或中括號語法來為物件添加或修改屬性。
const obj = { A: "a" };
// 添加新屬性
obj.B = "b";
obj["C"] = "c";
console.log(obj); // 输出 { A: "a", B: "b", C: "c" }
解構賦值 (Destructuring Assignment)
解構賦值並設置預設值:
在解構賦值時,可以為變數設置預設值,若物件沒有該屬性,則會使用預設值。
function greetUser({ name = "Guest", age = 18 } = {}) {
console.log(`Hello, ${name}! You are ${age} years old.`);
}
// 呼叫時有傳入值
greetUser({ name: "Alice", age: 25 }); // 輸出: Hello, Alice! You are 25 years old.
// 呼叫時未傳入 name 和 age,使用預設值
greetUser({}); // 輸出: Hello, Guest! You are 18 years old.
展開物件 (Spread Syntax for Objects)
可以使用展開運算符(...
)來創建一個新的物件並合併其他物件的屬性。
const A = { A: "a" };
// 使用展開運算符合併物件
const updatedA = { ...A, B: "new key value" };
console.log(updatedA); // 输出 { A: "a", B: "new key value" }
陣列解構 (Array Destructuring)
陣列解構賦值允許從陣列中提取出值並賦給變數。
const arr = [1, 2, 3];
const [a, b, c] = arr;
console.log(a); // 1
console.log(b); // 2
console.log(c); // 3
交換變數值 (Swapping Variables)
使用解構可以簡單地交換兩個變數的值:
let left = 5;
let right = 10;
// 交換變數值
[right, left] = [left, right];
console.log(left); // 10
console.log(right); // 5
JSON
JSON.stringify() //將 JavaScript 物件轉換為 JSON 字串 JSON.parse() //將 JavaScript 字串 轉換為 JSON 物件
const person = {
firstName: "John",
lastName: "Doe",
age: 30,
};
//將 JavaScript 物件 轉換為 JSON 字串
const jsonString = JSON.stringify(person);
console.log(typeof(jsonString) + jsonString);
//將 JavaScript 字串 轉換為 JSON 物件
const parsedObject = JSON.parse(jsonString);
console.log(typeof(parsedObject) + parsedObject);
Document Object Model
透過classList可以在Element中添加class,再透過物件導向程式語言和Css可以實現動態渲染。
const item = document.createElement("div") item.classList.add("oen") item.classList.remove("one")
ES Module
ES Module是JavaScript的技術,將物件類別模組化,可以導出到不同的檔案中,使專案更具結構
主要分為export
default
export 導出
一個檔案中可以有多個export導出,原因是該導出(import)物件類別必須是相同名稱,因此可以很清楚的導入對應的物件類別
重點: export導出多個物件、變數、函式
//page1.js
export const object1 = "1"
export function HomeFuction() {
return (
<div>...</div>
)
}
//page2.js
import { HomeFuction, object1 } from './page1.js' //選擇導出
import * as all from './page1.js' //導入全部
export default 導出
一個檔案中只可以有一個默認導出,可以自訂導出類別的名稱,
重點: export default導出單個類別
//page.js
export default function HomePage() {
return (
<div>...</div>
)
}
//page2.js
import HomePage from './page.js'//導出唯一默認
await
await
是用於等待 Promise 解析的關鍵字,通常與 async
函數一起使用。async
函數允許你使用 await
在 Promise 解析後繼續執行代碼,而不必使用回調函數。
技術文件參考 連結
async function fetchData() {
try {
const response = await fetch('<https://api.example.com/data>');
const data = await response.json();
return data;
} catch (error) {
console.error("Error fetching data", error);
}
}
其他
TypeScript (升級成強型別語言) (待編輯)
npm install typescript @types/node ts-node tsconfig-paths --save-dev
typescript
:TypeScript 編譯器。@types/node
:Node.js 的類型定義。ts-node
:直接運行 TypeScript 文件的工具(開發環境)。tsconfig-paths
:支持基於 TypeScript 路徑別名的模組加載(可選)。
npx tsc --init
類型斷言(Type Assertion)
Type
type Data = { name : String age : number } function getDataAge(props : Data){ return props.age; }
const data: {} = {} as any;
TypeScript Key
- Tuple
Browser Storage
sessionStorage.setItem() sessionStorage.removeItem()