2026年11月9日 星期一

JavaScript 入門教學(十二):內建物件(Date、Math、字串、陣列與 JSON)

JavaScript 內建了許多現成的物件與方法,不必自己從頭寫。本篇整理最常用的五類:日期(Date)、數學(Math)、字串、陣列與 JSON。熟悉它們,可以省下大量重複的程式碼。

一、Date:日期與時間

const now = new Date();                 // 現在的日期時間
console.log(now.getFullYear());         // 年,例如 2026
console.log(now.getMonth() + 1);        // 月:回傳 0~11,所以要加 1
console.log(now.getDate());             // 日
console.log(now.getDay());              // 星期:0 是星期日,6 是星期六

console.log(now.toLocaleDateString('zh-TW'));   // 依地區格式顯示日期

最容易出錯的是月份:getMonth() 的 0 代表一月。建立指定日期時也是同樣規則:

const newYear = new Date(2027, 0, 1);   // 2027 年 1 月 1 日(月份寫 0)

計算兩個日期相差幾天

const d1 = new Date(2026, 10, 8);       // 2026-11-08
const d2 = new Date(2027, 0, 1);        // 2027-01-01
const days = Math.round((d2 - d1) / (1000 * 60 * 60 * 24));
console.log(days);                      // 54

兩個日期相減,得到的是毫秒數,再除以一天的毫秒數即可。使用 Math.round 是為了避開夏令時間造成的小誤差。

二、Math:數學運算

方法說明範例
Math.round(x)四捨五入Math.round(2.5) 得 3
Math.floor(x)無條件捨去Math.floor(2.9) 得 2
Math.ceil(x)無條件進位Math.ceil(2.1) 得 3
Math.max/min最大/最小值Math.max(3, 9, 5) 得 9
Math.random()0 到不含 1 的隨機小數見下方
// 擲骰子:1~6 的隨機整數
const dice = Math.floor(Math.random() * 6) + 1;

// 陣列取最大值,用展開運算子
const scores = [78, 92, 65];
console.log(Math.max(...scores));       // 92

另外,(3.14159).toFixed(2) 可以指定小數位數,回傳的是字串 '3.14';(1234567).toLocaleString('zh-TW') 會加上千分位,得到 '1,234,567'。

三、字串常用方法

const s = '  Hello JavaScript  ';

console.log(s.trim());                  // 'Hello JavaScript'(去掉前後空白)
console.log(s.trim().length);           // 16
console.log(s.includes('Java'));        // true
console.log(s.trim().toUpperCase());    // 'HELLO JAVASCRIPT'
console.log(s.trim().slice(0, 5));      // 'Hello'
console.log(s.replace('Hello', 'Hi'));  // '  Hi JavaScript  '
console.log('a,b,c'.split(','));        // ['a', 'b', 'c']
console.log(String(5).padStart(2, '0')); // '05',常用於補零

字串是「不可變」的,這些方法都會回傳新字串,不會修改原本的字串。

四、陣列常用方法

方法用途
map把每個元素轉換,得到新陣列
filter篩選符合條件的元素
find找出第一個符合條件的元素
reduce把所有元素合併成一個值(例如加總)
sort排序(會直接修改原陣列)
includes是否包含某個值
const scores = [78, 92, 65, 88, 95];

const doubled = scores.map(n => n * 2);          // [156, 184, 130, 176, 190]
const passed  = scores.filter(n => n >= 80);      // [92, 88, 95]
const first   = scores.find(n => n < 70);         // 65
const sum     = scores.reduce((total, n) => total + n, 0);   // 418

// sort 預設是依「字串」比較,數字一定要給比較函式
const desc = [...scores].sort((a, b) => b - a);  // [95, 92, 88, 78, 65]

注意:sort 會直接改變原陣列,所以上面先用 [...scores] 複製一份再排序。如果寫成 [10, 9, 100].sort(),結果會是 [10, 100, 9],這是新手常見的陷阱。

五、JSON:資料與字串互轉

const user = { name: '小明', age: 20, tags: ['學生', '社團'] };

const text = JSON.stringify(user);      // 物件 → JSON 字串
const back = JSON.parse(text);          // JSON 字串 → 物件

console.log(back.name);                 // '小明'

JSON.parse 遇到格式錯誤的字串會拋出錯誤,不確定來源時要用 try...catch 包起來(下一篇會介紹)。JSON 的字串一律要用雙引號,且不能有結尾逗號。

六、綜合範例:成績統計

const scores = [78, 92, 65, 88, 95];

const total = scores.reduce((t, n) => t + n, 0);
const avg   = total / scores.length;
const best  = Math.max(...scores);
const worst = Math.min(...scores);
const passCount = scores.filter(n => n >= 60).length;

console.log('平均:' + avg.toFixed(1));     // 平均:83.6
console.log('最高:' + best + ',最低:' + worst);   // 最高:95,最低:65
console.log('及格人數:' + passCount);      // 及格人數:5

七、練習題

  1. 顯示「今天是 2026 年 11 月 8 日 星期日」格式的日期(要把 getDay() 的數字轉成中文星期)。
  2. 算出你的生日還有幾天,若今年已過,改算明年。
  3. 有一個價格陣列 [120, 45, 300, 80],找出大於 100 的價格,並算出它們的總和。
  4. 把 ['b', 'a', 'c'] 排序後轉成 JSON 字串。

結語

這些內建物件是日常程式的基本工具,先熟悉用途,需要時再查細節即可。下一篇要學習如何處理錯誤與除錯,讓程式出問題時能快速找到原因。

沒有留言:

張貼留言