跳至主要内容

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 迴圈
  • 物件操作、型別轉換

學習建議

  1. 先掌握超高頻語法 - 這些在90%的題目中都會用到
  2. 多練習陣列方法組合 - 如 arr.filter().map().reduce()
  3. 熟記輸入輸出格式 - 很多人在這裡卡住
  4. 重點練習字串與陣列互轉 - 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 語法和模式。建議先熟悉這些基礎,然後開始練習簡單的題目!