JavaScript中傳值跟傳址的區別
在JavaCcript中,有分為純值(Primitive Types)跟物件Object兩種資料型別,除了Primitive Types外的資料型別都是物件(Object)
純值(Primitive Types)
Primitive Types的特性有
- 不可變性(Immutability):純值是不可變的,這意味著一旦創建,它們的值不能被修改。任何修改純值的操作都會返回一個新的值,而不會改變原始值。這有助於避免在應用程序中不小心改變數據。
- 按值比較(Value-Based Comparison):比較兩個純值時,實際比較的是它們的值。如果兩個純值的值相同,則它們被視為相等。
- 可哈希性(Hashability):純值通常是可哈希的,這意味著它們可以用作對象的鍵(key)或存儲在集合中,如 JavaScript 中的 Set 或 Map。
- 簡單數據類型(Simple Data Types):JavaScript 中的基本數據類型,包括數字(number)、字串(string)、布林(boolean)、undefined 和 null,都是純值。
- 傳值(Pass-by-Value):當將純值傳遞給函數或從一個變數賦值給另一個變數時,實際上是將該值的複本傳遞給了目標。這意味著在函數內部修改該值不會影響到原始值。
型態
Primitive Types有以下幾種
- Null
- Undefined
- Boolean
- Number
- String
- Symbol(ES6後才有)
物件(Objects)
Objects都是pass by reference
當我們在傳值或賦值給另外一個Object時,其實傳遞的是物件的引用,也就是記憶體位址,所以當複製的物件被改動時,原始的物件也會一併被改動,因為他們都是指向同一個記憶體位址
複製的方法可以改成下面幾種方式,來避免修改到原始物件
物件是Array
team2 = players.slice(); // or create a new array and concat the old one in team3 = [].concat(players); // or use the new ES6 Spread team4 = [...players];
物件是Object,可以用
Object.asign()
或是淺拷貝()function createCopy(obj) { return Object.assign({}, obj); // 使用Object.assign()創建物件副本 } let originalObject = { property: "value" }; let copy = createCopy(originalObject); copy.property = "new value"; console.log(originalObject.property); // "value" console.log(copy.property); // "new value"
注意淺拷貝只會複製第一層,我的這篇文章有稍微詳細的解釋
型態
常見的物件型態有
物件(Objects):物件是一種複合資料型別,用於組織和存儲多個值。物件以鍵-值對的形式存儲數據,可以包含各種類型的數據,包括純值、函數和其他物件。
let person = { name: "John", age: 30, isStudent: false, sayHello: function() { console.log("Hello!"); } };
數組(Arrays):數組是一種特殊的物件,用於按順序存儲多個值。數組的元素可以是任何資料型別,並使用索引訪問。
let colors = ["red", "green", "blue"];
函數(Functions):函數是一種特殊的物件,可以執行操作並返回值。函數在 JavaScript 中是一級公民,可以存儲在變數中、作為參數傳遞和作為返回值返回。
function add(a, b) { return a + b; }
日期(Date):Date 型別用於處理日期和時間。它允許創建日期對象,執行日期計算和格式化。
let currentDate = new Date();
正則表達式(Regular Expressions):正則表達式是用於搜索和匹配字符串模式的工具。它們以字面值或構造函數的方式創建。
let regex = /pattern/;
Map 和 Set:Map 是一種鍵-值對的集合,而 Set 是一種唯一值的集合。它們提供了高效的數據存儲和查找方式。
let myMap = new Map(); myMap.set("name", "Alice"); let mySet = new Set(); mySet.add(1);