JavaScript 解題常用語法複習
基本語法
變數宣告
let x = 5; // 可變變數
const y = 10; // 不可變常數
var z = 15; // 舊式宣告(盡量避免)
資料型別檢查
typeof variable; // 回傳型別字串
Array.isArray(arr); // 檢查是否為陣列
Number.isInteger(num); // 檢查是否為整數
陣列操作
基本方法(超高頻)
let arr = [1, 2, 3, 4, 5];
// 新增/移除元素(超常用)
arr.push(6); // 末尾添加 → [1,2,3,4,5,6]
arr.pop(); // 移除末尾 → [1,2,3,4,5]
arr.length; // 陣列長度 → 5
// 合併陣列(常用)
arr.concat([6, 7]); // 合併陣列 → [1,2,3,4,5,6,7]
[...arr1, ...arr2]; // 展開運算子合併(推薦)
// 複製陣列(常用)
let copy = [...arr]; // 淺複製(推薦)
let copy2 = arr.slice(); // 淺複製(傳統寫法)
陣列搜尋與檢查(超高頻)
arr.indexOf(3); // 找索引,沒找到回傳-1 ⭐
arr.includes(3); // 檢查是否包含,回傳布林值 ⭐
arr.find(x => x > 3); // 找第一個符合條件的元素 ⭐
arr.findIndex(x => x > 3); // 找第一個符合條件的索引
高階陣列方法(解題核心 ⭐⭐⭐)
let numbers = [1, 2, 3, 4, 5];
// map - 轉換每個元素(超高頻)
let doubled = numbers.map(x => x * 2); // [2,4,6,8,10]
let strings = numbers.map(x => x.toString()); // ["1","2","3","4","5"]
// filter - 篩選元素(超高頻)
let evens = numbers.filter(x => x % 2 === 0); // [2,4]
let greaterThan2 = numbers.filter(x => x > 2); // [3,4,5]
// reduce - 累加/合併(高頻)
let sum = numbers.reduce((acc, curr) => acc + curr, 0); // 15
let max = numbers.reduce((acc, curr) => Math.max(acc, curr)); // 5
let product = numbers.reduce((acc, curr) => acc * curr, 1); // 120
// some/every - 條件檢查(中頻)
let hasEven = numbers.some(x => x % 2 === 0); // true
let allPositive = numbers.every(x => x > 0); // true
// sort - 排序(超高頻)
numbers.sort(); // 字典序排序
numbers.sort((a, b) => a - b); // 數字升序 ⭐
numbers.sort((a, b) => b - a); // 數字降序 ⭐
// forEach - 遍歷(中頻,但 for...of 更常用)
numbers.forEach((item, index) => {
console.log(index, item);
});
字串處理
基本操作(超高頻)
let str = "Hello World";
// 基本屬性與方法
str.length; // 11 ⭐
str.charAt(0); // "H" ⭐
str[0]; // "H" (推薦用法) ⭐
// 搜尋(超高頻)
str.indexOf("World"); // 6 ⭐
str.includes("World"); // true ⭐
str.startsWith("Hello"); // true
str.endsWith("World"); // true
字串轉換與處理(高頻)
// 大小寫轉換(高頻)
str.toLowerCase(); // "hello world" ⭐
str.toUpperCase(); // "HELLO WORLD" ⭐
// 分割與合併(超高頻)
str.split(" "); // ["Hello", "World"] ⭐
str.split(""); // ["H","e","l","l","o"," ","W","o","r","l","d"] ⭐
["Hello", "World"].join(" "); // "Hello World" ⭐
["H","i"].join(""); // "Hi" ⭐
// 去除空白(中頻)
" Hello ".trim(); // "Hello"
// 替換(中頻)
str.replace("World", "JS"); // "Hello JS" (只替換第一個)
str.replaceAll("l", "L"); // "HeLLo WorLd" (替換所有)
迴圈
基本迴圈(超高頻)
let arr = [1, 2, 3, 4, 5];
// for...of(遍歷值)- 推薦 ⭐
for (let value of arr) {
console.log(value);
}
// 傳統 for 迴圈(需要索引時使用)⭐
for (let i = 0; i < arr.length; i++) {
console.log(i, arr[i]);
}
// forEach(中頻,但無法 break)
arr.forEach((item, index) => {
console.log(index, item);
});
迴圈控制(中頻)
// while(中頻)
let i = 0;
while (i < 5) {
console.log(i);
i++;
}
// break 和 continue(中頻)
for (let i = 0; i < 10; i++) {
if (i === 3) continue; // 跳過這次迭代
if (i === 7) break; // 結束迴圈
console.log(i);
}
物件操作
基本操作(中頻)
let obj = {name: "John", age: 30};
// 取值
obj.name; // "John" ⭐
obj["name"]; // "John"(動態鍵名時用)
// 檢查屬性
obj.hasOwnProperty("name"); // true
"name" in obj; // true
物件方法(中頻)
let obj = {name: "John", age: 30};
// 取得鍵、值、鍵值對(解題常用)
Object.keys(obj); // ["name", "age"] ⭐
Object.values(obj); // ["John", 30] ⭐
Object.entries(obj); // [["name", "John"], ["age", 30]] ⭐
條件判斷與比較
比較運算子(超高頻)
// 嚴格相等(建議使用)⭐
x === 5; // 型別和值都要相同
x !== 5; // 不相等
// 數值比較 ⭐
x > 5;
x >= 5;
x < 5;
x <= 5;
邏輯運算(高頻)
// 邏輯運算子 ⭐
x > 0 && x < 10; // AND
x === 1 || x === 2; // OR
!(x > 5); // NOT
// 短路求值(中頻)
let result = x || "default"; // 如果x為falsy,使用"default"
let result2 = x && x.property; // 如果x為truthy,取x.property
條件語句(超高頻)
// if...else ⭐
if (x > 5) {
console.log("大於5");
} else if (x === 5) {
console.log("等於5");
} else {
console.log("小於5");
}
// 三元運算子 ⭐
let result = (x > 5) ? "大於5" : "不大於5";
數學與工具函數
Math 物件(超高頻)
// 最大最小值 ⭐
Math.max(1, 2, 3); // 3
Math.min(1, 2, 3); // 1
Math.max(...arr); // 陣列的最大值 ⭐
Math.min(...arr); // 陣列的最小值 ⭐
// 取整(高頻)
Math.floor(4.7); // 4 (向下取整) ⭐
Math.ceil(4.1); // 5 (向上取整)
Math.round(4.5); // 5 (四捨五入)
// 其他常用
Math.abs(-5); // 5 (絕對值) ⭐
Math.pow(2, 3); // 8 (2的3次方)
Math.sqrt(16); // 4 (平方根)
型別轉換(超高頻)
// 轉數字 ⭐
parseInt("123"); // 123 ⭐
parseFloat("123.45"); // 123.45
Number("123"); // 123
+"123"; // 123 (一元加號)
// 轉字串 ⭐
String(123); // "123"
(123).toString(); // "123"
123 + ""; // "123" ⭐
// 轉布林(中頻)
Boolean(0); // false
Boolean(""); // false
Boolean("hello"); // true
!!value; // 雙重否定轉布林
HackerRank 常用模式
輸入處理(必會)
// 標準輸入處理 ⭐
function processData(input) {
let lines = input.trim().split('\n');
let n = parseInt(lines[0]);
// 處理資料...
console.log(result);
}
// 讀取陣列 ⭐
let arr = lines[1].split(' ').map(Number);
// 讀取多個數字 ⭐
let [a, b, c] = lines[1].split(' ').map(Number);
常見演算法片段(超高頻)
// 計算陣列總和 ⭐
let sum = arr.reduce((acc, curr) => acc + curr, 0);
// 找最大最小值 ⭐
let max = Math.max(...arr);
let min = Math.min(...arr);
// 排序 ⭐
arr.sort((a, b) => a - b); // 升序
arr.sort((a, b) => b - a); // 降序
// 去除重複元素 ⭐
let unique = [...new Set(arr)];
// 計算元素出現次數 ⭐
let count = {};
arr.forEach(item => {
count[item] = (count[item] || 0) + 1;
});
// 反轉陣列/字串 ⭐
let reversed = [...arr].reverse(); // 不改變原陣列
let reversedStr = str.split('').reverse().join('');
// 檢查數字是否為偶數/奇數 ⭐
let isEven = num % 2 === 0;
let isOdd = num % 2 === 1;
輸出格式(必會)
// 基本輸出 ⭐
console.log(result);
// 輸出多個值 ⭐
console.log(results.join(' ')); // 用空格連接
console.log(results.join('\n')); // 用換行連接
重要提醒
語法優先級
⭐⭐⭐ 超高頻必會:
map()
,filter()
,reduce()
,sort()
split()
,join()
,indexOf()
,includes()
for...of
迴圈、if/else
、三元運算子Math.max/min(...arr)
、parseInt()
⭐⭐ 高頻重要:
find()
,some()
,every()
push()
,pop()
,length
Object.keys/values/entries()
⭐ 中頻備用:
forEach()
,while
迴圈- 物件操作、型別轉換
學習建議
- 先掌握超高頻語法 - 這些在90%的題目中都會用到
- 多練習陣列方法組合 - 如
arr.filter().map().reduce()
- 熟記輸入輸出格式 - 很多人在這裡卡住
- 重點練習字串與陣列互轉 -
split()
和join()
超常用多個值 console.log(result1, result2, result3); console.log(results.join(' '));
## 除錯技巧
### 常用除錯方法
```javascript
// 輸出變數檢查
console.log("Debug:", variable);
console.log("Type:", typeof variable);
console.log("Length:", variable.length);
// 檢查陣列內容
console.log("Array:", JSON.stringify(arr));
// 步驟追蹤
console.log("Step 1 completed");
常見錯誤
// 避免修改原陣列(如果需要保留)
let sorted = arr.slice().sort((a, b) => a - b);
// 注意整數除法
let result = Math.floor(a / b); // 整數除法
// 處理邊界情況
if (arr.length === 0) return 0;
// 注意型別轉換
let num = parseInt(str); // 而不是直接使用str
這份複習資料涵蓋了在 HackerRank 解題時最常用的 JavaScript 語法和模式。建議先熟悉這些基礎,然後開始練習簡單的題目!