變數宣告與資料型態
三種宣告方式
var name = "小明"; // ← 舊式宣告(不推薦,有作用域問題)
let age = 20; // ← 現代宣告(可以改值)
const PI = 3.14; // ← 常數宣告(不能改值)
逐行解析:
var name = "小明"; // var 是 ES5 的宣告方式,作用域是「函數」
// 問題:在 if/for 裡宣告的 var 會洩漏到外面
let age = 20; // let 是 ES6 的宣告方式,作用域是「區塊 {}」
// ✅ 推薦使用 let
const PI = 3.14; // const 也是 ES6,宣告後不能重新賦值
// ✅ 不會改的值用 const
var 的問題
// var 的作用域是「函數」,不是「區塊」
if (true) {
var x = 10; // ← 用 var 宣告
}
console.log(x); // ← 10(洩漏到 if 外面了!)
if (true) {
let y = 10; // ← 用 let 宣告
}
console.log(y); // ← ❌ ReferenceError(let 限制在 {} 內)
七種基本型態
1. Number(數字)
let integer = 42; // ← 整數
let float = 3.14; // ← 浮點數(JS 不區分整數和小數)
let negative = -10; // ← 負數
let infinity = Infinity; // ← 無限大
let notANumber = NaN; // ← Not a Number(非數字)
// 特殊值
console.log(0.1 + 0.2); // ← 0.30000000000000004(浮點數精度問題!)
console.log(10 / 0); // ← Infinity
console.log("hello" * 2); // ← NaN(字串不能乘)
console.log(typeof 42); // ← "number"
2. String(字串)
let single = '單引號'; // ← 單引號
let double = "雙引號"; // ← 雙引號
let backtick = `模板字串`; // ← 反引號(ES6 模板字串)
// 模板字串可以嵌入變數
let name = "小明";
let greeting = `你好,${name}!今年 ${20 + 1} 歲。`;
// → "你好,小明!今年 21 歲。"
// 字串方法
console.log("Hello".length); // ← 5
console.log("Hello".toUpperCase()); // ← "HELLO"
console.log("Hello".includes("ell")); // ← true
console.log("Hello".slice(1, 3)); // ← "el"(從位置 1 到 3)
3. Boolean(布林)
let isActive = true;
let isDeleted = false;
// 假值(Falsy)— 會被判斷為 false
console.log(Boolean(0)); // false
console.log(Boolean("")); // false(空字串)
console.log(Boolean(null)); // false
console.log(Boolean(undefined)); // false
console.log(Boolean(NaN)); // false
// 其他都是真值(Truthy)
console.log(Boolean(1)); // true
console.log(Boolean("hello")); // true
console.log(Boolean([])); // true(空陣列也是 true!)
4-7. 其他型態
let empty = null; // ← null:刻意設為「空」
let notDefined = undefined; // ← undefined:還沒給值
let id = Symbol("id"); // ← Symbol:唯一識別碼(ES6)
let big = 9007199254740991n; // ← BigInt:超大整數(ES2020)
console.log(typeof null); // ← "object"(這是 JS 的歷史 bug!)
console.log(typeof undefined); // ← "undefined"
型態轉換
// 字串 → 數字
Number("42") // ← 42
parseInt("42.5") // ← 42(取整數)
parseFloat("42.5") // ← 42.5
+"42" // ← 42(一元加號轉換)
// 數字 → 字串
String(42) // ← "42"
(42).toString() // ← "42"
42 + "" // ← "42"(加空字串)
// ⚠️ 隱式轉換陷阱
console.log("5" + 3); // ← "53"(字串串接!)
console.log("5" - 3); // ← 2(減法會轉數字)
console.log("5" == 5); // ← true(== 會隱式轉換)
console.log("5" === 5); // ← false(=== 嚴格比較,不轉換)
💡 永遠用
===而不是==,避免隱式轉換的坑。