
- Javascript 基礎教程
- Javascript - 首頁
- JavaScript - 路線圖
- JavaScript - 概述
- JavaScript - 特性
- JavaScript - 啟用
- JavaScript - 位置
- JavaScript - 語法
- JavaScript - Hello World
- JavaScript - Console.log()
- JavaScript - 註釋
- JavaScript - 變數
- JavaScript - let 語句
- JavaScript - 常量
- JavaScript - 資料型別
- JavaScript - 型別轉換
- JavaScript - 嚴格模式
- JavaScript - 保留關鍵字
- JavaScript 運算子
- JavaScript - 運算子
- JavaScript - 算術運算子
- JavaScript - 比較運算子
- JavaScript - 邏輯運算子
- JavaScript - 位運算子
- JavaScript - 賦值運算子
- JavaScript - 條件運算子
- JavaScript - typeof 運算子
- JavaScript - 空值合併運算子
- JavaScript - delete 運算子
- JavaScript - 逗號運算子
- JavaScript - 分組運算子
- JavaScript - yield 運算子
- JavaScript - 展開運算子
- JavaScript - 指數運算子
- JavaScript - 運算子優先順序
- JavaScript 控制流
- JavaScript - If...Else
- JavaScript - While 迴圈
- JavaScript - For 迴圈
- JavaScript - For...in
- Javascript - For...of
- JavaScript - 迴圈控制
- JavaScript - Break 語句
- JavaScript - Continue 語句
- JavaScript - Switch Case
- JavaScript - 使用者定義迭代器
- JavaScript 函式
- JavaScript - 函式
- JavaScript - 函式表示式
- JavaScript - 函式引數
- JavaScript - 預設引數
- JavaScript - Function() 建構函式
- JavaScript - 函式提升
- JavaScript - 自執行函式
- JavaScript - 箭頭函式
- JavaScript - 函式呼叫
- JavaScript - Function call()
- JavaScript - Function apply()
- JavaScript - Function bind()
- JavaScript - 閉包
- JavaScript - 變數作用域
- JavaScript - 全域性變數
- JavaScript - 智慧函式引數
- JavaScript 物件
- JavaScript - Number
- JavaScript - Boolean
- JavaScript - Strings
- JavaScript - Arrays
- JavaScript - Date
- JavaScript - DataView
- JavaScript - Handler
- JavaScript - Math
- JavaScript - RegExp
- JavaScript - Symbol
- JavaScript - Sets
- JavaScript - WeakSet
- JavaScript - Maps
- JavaScript - WeakMap
- JavaScript - 可迭代物件
- JavaScript - Reflect
- JavaScript - TypedArray
- JavaScript - 模板字面量
- JavaScript - 標記模板
- 面向物件 JavaScript
- JavaScript - 物件
- JavaScript - 類
- JavaScript - 物件屬性
- JavaScript - 物件方法
- JavaScript - 靜態方法
- JavaScript - 顯示物件
- JavaScript - 物件訪問器
- JavaScript - 物件建構函式
- JavaScript - 原生原型
- JavaScript - ES5 物件方法
- JavaScript - 封裝
- JavaScript - 繼承
- JavaScript - 抽象
- JavaScript - 多型
- JavaScript - 解構賦值
- JavaScript - 物件解構
- JavaScript - 陣列解構
- JavaScript - 巢狀解構
- JavaScript - 可選鏈
- JavaScript - 全域性物件
- JavaScript - Mixins
- JavaScript - 代理
- JavaScript 版本
- JavaScript - 歷史
- JavaScript - 版本
- JavaScript - ES5
- JavaScript - ES6
- ECMAScript 2016
- ECMAScript 2017
- ECMAScript 2018
- ECMAScript 2019
- ECMAScript 2020
- ECMAScript 2021
- ECMAScript 2022
- JavaScript 非同步
- JavaScript - 非同步
- JavaScript - 回撥函式
- JavaScript - Promise
- JavaScript - Async/Await
- JavaScript - 微任務
- JavaScript - Promise 化
- JavaScript - Promise 鏈式呼叫
- JavaScript - 定時事件
- JavaScript - setTimeout()
- JavaScript - setInterval()
- JavaScript Cookie
- JavaScript - Cookie
- JavaScript - Cookie 屬性
- JavaScript - 刪除 Cookie
- JavaScript 瀏覽器 BOM
- JavaScript - 瀏覽器物件模型
- JavaScript - Window 物件
- JavaScript - Document 物件
- JavaScript - Screen 物件
- JavaScript - History 物件
- JavaScript - Navigator 物件
- JavaScript - Location 物件
- JavaScript - Console 物件
- JavaScript Web API
- JavaScript - Web API
- JavaScript - History API
- JavaScript - Storage API
- JavaScript - Forms API
- JavaScript - Worker API
- JavaScript - Fetch API
- JavaScript - Geolocation API
- JavaScript 事件
- JavaScript - 事件
- JavaScript - DOM 事件
- JavaScript - addEventListener()
- JavaScript - 滑鼠事件
- JavaScript - 鍵盤事件
- JavaScript - 表單事件
- JavaScript - Window/Document 事件
- JavaScript - 事件委託
- JavaScript - 事件冒泡
- JavaScript - 事件捕獲
- JavaScript - 自定義事件
- JavaScript 錯誤處理
- JavaScript - 錯誤處理
- JavaScript - try...catch
- JavaScript - 除錯
- JavaScript - 自定義錯誤
- JavaScript - 擴充套件錯誤
- JavaScript 重要關鍵字
- JavaScript - this 關鍵字
- JavaScript - void 關鍵字
- JavaScript - new 關鍵字
- JavaScript - var 關鍵字
- JavaScript HTML DOM
- JavaScript - HTML DOM
- JavaScript - DOM 方法和屬性
- JavaScript - DOM 文件
- JavaScript - DOM 元素
- JavaScript - DOM 屬性 (Attr)
- JavaScript - DOM 表單
- JavaScript - 更改 HTML
- JavaScript - 更改 CSS
- JavaScript - DOM 動畫
- JavaScript - DOM 導航
- JavaScript - DOM 集合
- JavaScript - DOM NodeList
- JavaScript - DOM DOMTokenList
- JavaScript 雜項
- JavaScript - Ajax
- JavaScript - 非同步迭代
- JavaScript - Atomics 物件
- JavaScript - rest 引數
- JavaScript - 頁面重定向
- JavaScript - 對話方塊
- JavaScript - 頁面列印
- JavaScript - 驗證
- JavaScript - 動畫
- JavaScript - 多媒體
- JavaScript - 影像對映
- JavaScript - 瀏覽器
- JavaScript - JSON
- JavaScript - 多行字串
- JavaScript - 日期格式
- JavaScript - 獲取日期方法
- JavaScript - 設定日期方法
- JavaScript - 模組
- JavaScript - 動態匯入
- JavaScript - BigInt
- JavaScript - Blob
- JavaScript - Unicode
- JavaScript - 淺複製
- JavaScript - 呼叫棧
- JavaScript - 引用型別
- JavaScript - IndexedDB
- JavaScript - 點選劫持攻擊
- JavaScript - 柯里化
- JavaScript - 圖形
- JavaScript - Canvas
- JavaScript - 防抖
- JavaScript - 效能
- JavaScript - 樣式指南
JavaScript - 引用型別
JavaScript 引用型別
JavaScript 中有兩種資料型別:原始型別和引用型別。
原始資料型別是不可變的,這意味著它們不能被更改。JavaScript 中的原始資料型別包括:Number、String、Boolean、Undefined、Null、Symbol。
引用資料型別是可變的,這意味著它們可以被更改。JavaScript 中的引用資料型別包括:Object、Array、Function。
當您將原始資料型別賦值給變數時,變數會獲得該值的副本。當您將引用資料型別賦值給變數時,變數會獲得對該值的引用。這意味著,如果您更改了引用資料型別的值,則更改將反映在所有引用該值的變數中。
例如,以下程式碼建立了兩個變數 x 和 y,併為它們賦值 10
let x = 10; let y = 10;
變數 x 和 y 都擁有值 10 的副本。如果您更改了 x 的值,y 的值不會改變。
x = 20; console.log(x); // 20 console.log(y); // 10
以下程式碼建立了兩個變數 x 和 y,併為它們賦值一個數組
const x = [1, 2, 3]; const y = x;
變數 x 和 y 都引用了同一個陣列。如果您更改了 x 引用的陣列的值,則更改將反映在 y 引用的陣列中。
x[0] = 4; console.log(x); // [4, 2, 3] console.log(y); // [4, 2, 3]
瞭解 JavaScript 中原始型別和引用型別之間的區別非常重要,這樣您才能編寫出高效且可預測的程式碼。
物件和函式是 JavaScript 中兩種主要的引用型別,解釋如下。
物件
物件是鍵值對的無序集合,其中鍵是字串或符號,值可以是任何資料型別,包括其他物件。
const person = { firstName: "John", lastName: "Doe", age: 30 };
函式
函式在 JavaScript 中也是引用型別。函式是可呼叫的特殊型別的物件,用於執行任務。
function greet(name) { alert("Hello, " + name + "!"); }
示例
示例 1:物件可變性
在此示例中,我們演示了物件的可變性,首先建立一個物件,然後透過該引用進行修改,這反過來會影響原始物件。person 物件透過 anotherPerson 的引用進行修改,準確地說是年齡從 25 更改為 30。從輸出中可以看到,原始物件在修改後發生了變化,因此物件被認為是發生了變異。
<!DOCTYPE html> <html> <body> <h2>JavaScript Reference Types Example: Object Mutability</h2> <script> // Create an object const person = { name: "John", age: 25 }; // Create a reference to the object let anotherPerson = person; // Display the original object document.write("<p>Original Object: " + JSON.stringify(person) + "</p>"); // Modify the object through the reference anotherPerson.age = 30; // Display the modified object document.write("<p>Modified Object: " + JSON.stringify(person) + "</p>"); // Both references point to the same object, so changes are reflected in both document.write("<p>Original Object after modification through reference: " + JSON.stringify(person) + "</p>"); </script> </body> </html>
示例 2:陣列修改
此處演示了陣列,陣列可以在 JavaScript 中的單個變數記憶體儲不同資料型別的多個值。它們表現出可變性,這意味著當對陣列進行引用時,對引用的更改也會反映在原始陣列中。這裡我們建立了一個顏色的陣列並透過 moreColors 的引用對其進行修改,主要是透過推送元素“yellow”。
<!DOCTYPE html> <html> <body> <h2>JavaScript Reference Types Example: Array Modification</h2> <script> // Create an array const colors = ["red", "green", "blue"]; // Create a reference to the array let moreColors = colors; // Display the original array document.write("<p>Original Array: " + JSON.stringify(colors) + "</p>"); // Modify the array through the reference moreColors.push("yellow"); // Display the modified array document.write("<p>Modified Array: " + JSON.stringify(colors) + "</p>"); // Both references point to the same array, so changes are reflected in both document.write("<p>Original Array after modification through reference: " + JSON.stringify(colors) + "</p>"); </script> </body> </html>
示例 3:函式引用型別
在此示例中,我們建立了一個函式 greet,其引用最初被分配給 greetingFunction。在使用它說 Hello 後,我們將引用修改為指向一個不同的函式,該函式用 Hola 打招呼。這演示了 JavaScript 中函式引用的靈活性。
<!DOCTYPE html> <html> <body> <h2>JavaScript Reference Types Example: Function Invocation</h2> <script> // Create a function function greet(name) { return "Hello, " + name + "!"; } // Create a reference to the function let greetingFunction = greet; document.write("<p>Original Function Result: " + greetingFunction("John") + "</p>"); greetingFunction = function(name) { return "Hola, " + name + "!"; }; document.write("<p>Modified Function Result: " + greetingFunction("Maria") + "</p>"); </script> </body> </html>
示例 4:自定義類
此示例演示了 JavaScript 中的自定義類,從引用型別的角度來看,這是另一個關鍵方面。該類包含屬性和函式/方法。這裡我們建立一個名為 Book 的類,它具有建構函式和方法。建立了該 book 類的 4 個例項(book1、book2、book3、book4),併為其提供了相應的資料,例如標題、作者和流派。
<!DOCTYPE html> <html> <body> <h2>JavaScript Reference Types Example: Custom class</h2> <script> // Define a custom class for Book class Book { constructor(title, author, genre) { this.title = title; this.author = author; this.genre = genre; } // Method to get book details getDetails() { return `Title: ${this.title}<br>Author: ${this.author}<br>Genre: ${this.genre}`; } } // Create instances of the Book class const book1 = new Book("The Great Gatsby", "F. Scott Fitzgerald", "Fiction"); const book2 = new Book("To Kill a Mockingbird", "Harper Lee", "Classics"); const book3 = new Book("Harry Potter and the Sorcerer's Stone", "J.K. Rowling", "Fantasy"); const book4 = new Book("1984", "George Orwell", "Dystopian Fiction"); document.write("<h3>Book 1 Details:</h3>"); document.write("<p>" + book1.getDetails() + "</p>"); document.write("<h3>Book 2 Details:</h3>"); document.write("<p>" + book2.getDetails() + "</p>"); document.write("<h3>Book 3 Details:</h3>"); document.write("<p>" + book3.getDetails() + "</p>"); document.write("<h3>Book 4 Details:</h3>"); document.write("<p>" + book4.getDetails() + "</p>"); </script> </body> </html>
示例 5:不可變物件
本示例重點關注物件的不可變性,這在建立物件時使用 `Object.freeze()` 方法實現。不可變性基本上意味著物件在建立後不會改變,或者簡單地說,一旦定義了物件,就不能修改其屬性。這裡我們建立了一個名為“person”的物件,其屬性為“name”和“age”,然後嘗試將“age”更改為 35。但是,由於物件的凍結狀態,此修改被阻止並丟擲錯誤。不可變性是一個重要的方面,因為它有助於維護資料完整性,從而防止意外更改並增強程式碼執行的可預測性。
<!DOCTYPE html> <html> <body> <h2>Immutable Object with Error Handling</h2> <script> // Enable strict mode 'use strict'; // Create an immutable object const person = Object.freeze({ name: "Alice", age: 30 }); document.write("<p><strong>Before Modification:</strong></p>"); document.write("<p>Name: " + person.name + "</p>"); document.write("<p>Age: " + person.age + "</p>"); try { // Attempting to modify the object will result in an error person.age = 35; } catch (error) { document.write(error); } document.write("<p><strong>After Modification Attempt:</strong></p>"); document.write("<p>Name: " + person.name + "</p>"); document.write("<p>Age: " + person.age + "</p>"); </script> </body> </html>