變量
var:
var y = 1;
var y = 2; // 可以重複聲明
y = 3; // 可以重新賦值
let:
let x = 5;
x = 10; // 可以
let x = 20; // 錯誤,不能重複聲明
const:
const PI = 3.14159;
PI = 3; // 錯誤,不能重新賦值
const arr = [1, 2, 3];
arr.push(4); // 可以修改數組內容
arr = [5, 6]; // 錯誤,不能重新賦值
數據類型
字符串(String):
javascriptCopylet name = "Alice";
let greeting = `Hello, ${name}!`;
數字(Number):
javascriptCopylet integer = 42;
let float = 3.14;
布林值(Boolean):
javascriptCopylet isActive = true;
let hasPermission = false;
數組(Array):
javascriptCopylet fruits = ["apple", "banana", "orange"];
let mixed = [1, "two", true, {name: "object"}];
對象(Object):
let person = {
name: "Bob",
age: 30,
isStudent: false
};
小筆記區:
作用域
全局作用域(Global Scope):
在所有函數外部聲明的變量屬於全局作用域。
全局變量可以在程序的任何地方被訪問。
函數作用域(Function Scope):
在函數內部聲明的變量屬於該函數的作用域。
這些變量只能在函數內部被訪問。
使用var聲明的變量具有函數作用域。
塊級作用域(Block Scope):
ES6引入了let和const關鍵字,他們是用作創建塊級作用域的變量。
塊級作用域限定在{}內,包括if語句、for循環等。
詞法作用域(Lexical Scope):
也稱為靜態作用域。
內部函數可以訪問其外部函數的變量。
作用域是在代碼編寫時確定的,而不是在運行時。
變量遮蔽(Variable Shadowing):
當在內部作用域中聲明的變量與外部作用域中的變量同名時,內部變量會"遮蔽"外部變量。
變量提升
變量提升是指JavaScript引擎在執行代碼之前,會將變量和函數的聲明"提升"到它們所在作用域的頂部。這只是一個概念上的提升,實際上代碼的物理位置並沒有改變。
// 示例 1: 函數聲明的提升
console.log(x); // 輸出:undefined
x = 5;
console.log(x); // 輸出:5
// 示例 2: 函數聲明的提升
sayHello(); // 輸出:"Hello!"
function sayHello() {
console.log("Hello!");
}
// 示例 3: let 和 const 不會被提升
console.log(y); // 拋出 ReferenceError
let y = 10;
// 示例 4: 函數表達式不會被完全提升
sayHi(); // 拋出 TypeError
var sayHi = function() {
console.log("Hi!");
};
// 示例 5: 塊級作用域中的var
if (true) {
var blockVar = "I'm hoisted!";
}
console.log(blockVar); // 輸出:"I'm hoisted!"
// 示例 6: 函數內的var
function testHoisting() {
console.log(innerVar); // 輸出:undefined
var innerVar = "Inside function";
}
testHoisting();
var的提升:
使用var聲明的變量會被提升到其作用域的頂部。
但只有聲明會被提升,賦值不會被提升。
這就是為什麼第一個console.log(x)輸出undefined,而不是拋出錯誤。
函數聲明的提升:
整個函數聲明會被提升到其作用域的頂部。
這就是為什麼我們可以在聲明之前調用函數。
let和const的行為:
let 和 const 聲明的變量不會被提升。
它們會產生一個"暫時性死區"(Temporal Dead Zone),在聲明之前訪問這些變量會拋出ReferenceError。
函數表達式的提升:
當使用 var 聲明一個函數表達式時,只有變量聲明會被提升,函數賦值不會。
這就是為什麼調用 sayHi() 會拋出TypeError。
塊級作用域中的 var:
var 不遵循塊級作用域規則,它會被提升到最近的函數作用域或全局作用域。
函數內的 var:
在函數內使用var聲明的變量會被提升到函數作用域的頂部。