iT邦幫忙

2024 iThome 鐵人賽

DAY 5
1

變量

var:

  • 用於聲明函數作用域或全局作用域的變量。
  • 可以重新賦值和重複聲明。
  • 存在變量提升(hoisting)現象。
    (在 JavaScript 中,使用var聲明變量時,實際上發生了兩個步驟:
  1. 聲明(Declaration):在編譯階段,JavaScript 引擎會將變量聲明提升到其所在作用域的頂部。
  2. 初始化(Initialization):在代碼執行到變量聲明的位置時,才會進行初始化(賦值)。)
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):

  • 用於表示整數和浮點數。
    (JavaScript中只有一種數字類型。)
javascriptCopylet integer = 42;
let float = 3.14;

布林值(Boolean):

  • 只有兩個值:true和false,用於邏輯運算和條件判斷。
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聲明的變量會被提升到函數作用域的頂部。


上一篇
d4 自學進度安排
下一篇
d6 運算符和表達式
系列文
javascript基礎自學及各工具應用了解26
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言