JavaScript 基礎:變數與資料型別完全指南

2026-01-26 07:46 | By justin | JavaScript
(Updated: 2026-01-26 07:46)

JavaScript 基礎:變數與資料型別完全指南

各位好!

這篇是 JavaScript 系列的第二單元,我們要深入理解如何在 JavaScript 中儲存和處理資料。


變數宣告:const、let、var

JavaScript 有三種宣告變數的方式,但現代開發中主要使用前兩種。

const:常數(推薦優先使用)

const name = "小明";
const age = 25;
const PI = 3.14159;

// 嘗試修改會報錯
// name = "小華";  // TypeError: Assignment to constant variable

特性: - 宣告後不能重新賦值 - 必須在宣告時初始化 - 區塊作用域(後面會詳細說明)

何時使用: 當你確定這個變數不會被重新賦值時(大部分情況)

let:可變變數

let count = 0;
count = 1;      // 可以修改
count = count + 1;  // 可以重複修改

let status;     // 可以先宣告
status = "active";  // 之後再賦值

特性: - 可以重新賦值 - 可以先宣告後賦值 - 區塊作用域

何時使用: 當變數的值需要改變時(例如計數器、累加器)

var:舊式寫法(不推薦)

var oldStyle = "不建議使用";

為什麼不推薦: - 函式作用域(容易產生意外的變數覆蓋) - 變數提升(Hoisting)行為容易造成混淆 - 沒有區塊作用域的保護

結論: 現代開發中,優先使用 const,需要修改時才用 let,避免使用 var


基本資料型別

JavaScript 有七種基本資料型別(Primitive Types)。

1. String(字串)

字串是文字資料,用單引號、雙引號或反引號包起來。

const str1 = "Hello";
const str2 = 'World';
const str3 = `Hello World`;  // 模板字串

// 字串串接
const greeting = "Hello" + " " + "World";
console.log(greeting);  // "Hello World"

// 模板字串(推薦)
const name = "小明";
const age = 25;
const message = `我是${name},今年${age}歲`;
console.log(message);  // "我是小明,今年25歲"

// 跨行字串
const multiLine = `第一行
第二行
第三行`;

// 常用字串方法
const text = "JavaScript";
console.log(text.length);          // 10(長度)
console.log(text.toLowerCase());   // "javascript"
console.log(text.toUpperCase());   // "JAVASCRIPT"
console.log(text.slice(0, 4));     // "Java"
console.log(text.includes("Script")); // true

2. Number(數字)

JavaScript 的數字包含整數和浮點數。

const integer = 42;
const float = 3.14;
const negative = -10;
const scientific = 2.5e6;  // 2500000

// 基本運算
console.log(10 + 5);   // 15(加法)
console.log(10 - 5);   // 5(減法)
console.log(10 * 5);   // 50(乘法)
console.log(10 / 5);   // 2(除法)
console.log(10 % 3);   // 1(餘數)
console.log(2 ** 3);   // 8(次方)

// 特殊數字值
console.log(1 / 0);        // Infinity
console.log(-1 / 0);       // -Infinity
console.log("abc" / 2);    // NaN (Not a Number)

// 檢查是否為數字
console.log(isNaN(123));      // false
console.log(isNaN("abc"));    // true
console.log(Number.isInteger(3.14));  // false
console.log(Number.isInteger(42));    // true

3. Boolean(布林值)

布林值只有兩個值:truefalse

const isLoggedIn = true;
const hasPermission = false;

// 比較運算會回傳布林值
console.log(5 > 3);      // true
console.log(5 < 3);      // false
console.log(5 === 5);    // true
console.log(5 !== 10);   // true

// 邏輯運算
console.log(true && true);    // true(且)
console.log(true || false);   // true(或)
console.log(!true);           // false(非)

4. Undefined

變數已宣告但未賦值時的預設值。

let notAssigned;
console.log(notAssigned);  // undefined

function doSomething() {
  // 沒有 return 時,函式回傳 undefined
}
console.log(doSomething());  // undefined

5. Null

代表「刻意的空值」。

let user = null;  // 明確表示「沒有使用者」

// undefined vs null
let a;           // undefined(未賦值)
let b = null;    // null(明確設為空)

6. BigInt(大整數)

用於處理超過安全範圍的整數。

const bigNumber = 1234567890123456789012345678901234567890n;
console.log(typeof bigNumber);  // "bigint"

7. Symbol(符號)

用於建立唯一識別符(進階用途,初學者可以先跳過)。

const sym = Symbol("description");

型別檢查

使用 typeof 運算子檢查變數的型別。

console.log(typeof "Hello");      // "string"
console.log(typeof 42);           // "number"
console.log(typeof true);         // "boolean"
console.log(typeof undefined);    // "undefined"
console.log(typeof null);         // "object"(這是歷史遺留問題)
console.log(typeof {});           // "object"
console.log(typeof []);           // "object"(陣列也是物件)
console.log(typeof function(){}); // "function"

型別轉換

JavaScript 會自動轉換型別,但有時我們需要明確轉換。

自動型別轉換(隱式轉換)

// 字串 + 數字 = 字串
console.log("5" + 3);     // "53"

// 數字 - 字串 = 數字
console.log("5" - 3);     // 2

// 布林值轉數字
console.log(true + 1);    // 2
console.log(false + 1);   // 1

明確型別轉換(顯式轉換)

// 轉成字串
const num = 42;
const str = String(num);        // "42"
const str2 = num.toString();    // "42"

// 轉成數字
const text = "123";
const number = Number(text);    // 123
const int = parseInt("123.45"); // 123
const float = parseFloat("123.45"); // 123.45

// 轉成布林值
console.log(Boolean(1));        // true
console.log(Boolean(0));        // false
console.log(Boolean(""));       // false
console.log(Boolean("text"));   // true
console.log(Boolean(null));     // false
console.log(Boolean(undefined));// false

Truthy 和 Falsy 值

在條件判斷中,某些值會被視為 false

// Falsy 值(會被視為 false)
if (false) {}
if (0) {}
if ("") {}
if (null) {}
if (undefined) {}
if (NaN) {}

// 其他所有值都是 Truthy(會被視為 true)
if (true) {}
if (1) {}
if ("hello") {}
if ([]) {}      // 空陣列也是 truthy
if ({}) {}      // 空物件也是 truthy

實戰練習:變數與型別操作

// 練習 1:基本資料處理
const firstName = "王";
const lastName = "小明";
const fullName = firstName + lastName;
console.log(`完整姓名:${fullName}`);

// 練習 2:數學計算
const price = 100;
const quantity = 3;
const discount = 0.1;
const total = price * quantity * (1 - discount);
console.log(`總價:${total} 元`);

// 練習 3:溫度轉換
function celsiusToFahrenheit(celsius) {
  return (celsius * 9/5) + 32;
}
console.log(`25°C = ${celsiusToFahrenheit(25)}°F`);

// 練習 4:型別檢查與轉換
function addNumbers(a, b) {
  // 確保輸入是數字
  const num1 = Number(a);
  const num2 = Number(b);

  if (isNaN(num1) || isNaN(num2)) {
    return "請輸入有效的數字";
  }

  return num1 + num2;
}

console.log(addNumbers(5, 3));      // 8
console.log(addNumbers("5", "3"));  // 8
console.log(addNumbers("abc", 3));  // "請輸入有效的數字"

常見陷阱與注意事項

1. 字串數字相加

console.log("5" + 3);   // "53"(不是 8!)
console.log("5" - 3);   // 2(數學運算會轉型)

解決方法: 明確轉換型別

console.log(Number("5") + 3);  // 8

2. const 不是完全不可變

const arr = [1, 2, 3];
arr.push(4);  // 可以!陣列內容可以改變
console.log(arr);  // [1, 2, 3, 4]

// 但不能重新賦值
// arr = [5, 6, 7];  // 錯誤!

const obj = { name: "小明" };
obj.age = 25;  // 可以!物件屬性可以改變
console.log(obj);  // { name: "小明", age: 25 }

3. 比較運算的陷阱

// == vs ===
console.log(5 == "5");   // true(會自動轉型)
console.log(5 === "5");  // false(嚴格比較)

console.log(null == undefined);   // true
console.log(null === undefined);  // false

// 建議:永遠使用 === 和 !==

4. NaN 的特殊性

console.log(NaN === NaN);  // false(NaN 不等於任何值,包括自己)
console.log(isNaN(NaN));   // true(正確的檢查方式)

實用工具函式

// 檢查是否為數字
function isNumeric(value) {
  return !isNaN(parseFloat(value)) && isFinite(value);
}

console.log(isNumeric("123"));    // true
console.log(isNumeric("abc"));    // false
console.log(isNumeric("123abc")); // false

// 安全的字串轉數字
function toNumber(value, defaultValue = 0) {
  const num = Number(value);
  return isNaN(num) ? defaultValue : num;
}

console.log(toNumber("123"));     // 123
console.log(toNumber("abc"));     // 0
console.log(toNumber("abc", -1)); // -1

// 格式化數字(千分位)
function formatNumber(num) {
  return num.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
}

console.log(formatNumber(1234567));  // "1,234,567"

小結

這篇我們學習了:

  • 三種變數宣告方式:constletvar
  • 七種基本資料型別:String、Number、Boolean、Undefined、Null、BigInt、Symbol
  • 如何檢查和轉換型別
  • Truthy 和 Falsy 的概念
  • 常見陷阱與解決方法

下一步:

完成這篇後,你已經能夠: - 正確宣告和使用變數 - 處理不同型別的資料 - 理解型別轉換的機制

前往下一篇:單元三:運算子與條件判斷

在那裡,我們會學習如何用程式做決策和邏輯判斷。


0 留言

目前沒有留言

發表留言
回覆