Gelagat JavaScript mengenai kebolehubahan dan jenis rujukan adalah asas tetapi sering disalahertikan. Ketidakbolehubahan memastikan kestabilan data, manakala memahami jenis rujukan adalah penting untuk mengelakkan kesan sampingan yang tidak diingini. Mari terokai konsep ini secara terperinci, lengkap dengan contoh lanjutan dan fungsi utiliti untuk membantu anda memanfaatkan kuasanya dengan berkesan.
Ketidakbolehubah merujuk kepada konsep di mana keadaan objek tidak boleh diubah selepas penciptaannya. Dalam JavaScript, nilai primitif (cth., nombor, rentetan, boolean) sememangnya tidak boleh diubah, manakala jenis rujukan (cth., objek, tatasusunan) boleh diubah secara lalai.
Mengapa Ketidakbolehubah Penting
Contoh Data Boleh Ubah lwn. Tidak Boleh Ubah
// Mutable Example const mutableArray = [1, 2, 3]; mutableArray.push(4); // The original array is modified console.log(mutableArray); // [1, 2, 3, 4] // Immutable Example const immutableArray = [1, 2, 3]; const newArray = [...immutableArray, 4]; // Creates a new array console.log(immutableArray); // [1, 2, 3] console.log(newArray); // [1, 2, 3, 4]
Jenis rujukan (objek, tatasusunan, fungsi) disimpan dalam ingatan sebagai rujukan. Menetapkan atau menghantarnya kepada pembolehubah atau fungsi tidak menyalin nilainya; ia menyalin rujukan mereka.
Contoh:
const obj1 = { name: "Alice" }; const obj2 = obj1; obj2.name = "Bob"; console.log(obj1.name); // "Bob" - Both variables point to the same reference
Salinan Dalam lwn. Cetek
Contoh Salinan Cetek:
const obj = { name: "Alice", details: { age: 25 } }; const shallowCopy = { ...obj }; shallowCopy.details.age = 30; console.log(obj.details.age); // 30 - Nested objects are still linked
Contoh Salinan Dalam:
const deepCopy = JSON.parse(JSON.stringify(obj)); deepCopy.details.age = 35; console.log(obj.details.age); // 25 - Original object remains unchanged
1. Kemas Kini Tidak Berubah Objek Bersarang
function updateNestedObject(obj, path, value) { return path.reduceRight((acc, key, index) => { if (index === path.length - 1) { return { ...obj, [key]: value }; } return { ...obj, [key]: acc }; }, value); } // Example const state = { user: { name: "Alice", age: 25 } }; const newState = updateNestedObject(state, ["user", "age"], 30); console.log(newState); // { user: { name: "Alice", age: 30 } }
2. Utiliti Pengklonan Dalam
function deepClone(obj) { return structuredClone ? structuredClone(obj) : JSON.parse(JSON.stringify(obj)); } // Example const original = { a: 1, b: { c: 2 } }; const clone = deepClone(original); clone.b.c = 42; console.log(original.b.c); // 2 - Original remains unaffected
3. Objek Membekukan untuk Ketidakbolehubahan Lengkap
function deepFreeze(obj) { Object.freeze(obj); Object.keys(obj).forEach((key) => { if (typeof obj[key] === "object" && !Object.isFrozen(obj[key])) { deepFreeze(obj[key]); } }); } // Example const config = { api: { url: "https://example.com" } }; deepFreeze(config); config.api.url = "https://changed.com"; // Error in strict mode console.log(config.api.url); // "https://example.com"
4. Operasi Tatasusunan Tak Berubah
function immutableInsert(array, index, value) { return [...array.slice(0, index), value, ...array.slice(index)]; } function immutableRemove(array, index) { return [...array.slice(0, index), ...array.slice(index + 1)]; } // Example const arr = [1, 2, 3, 4]; const newArr = immutableInsert(arr, 2, 99); // [1, 2, 99, 3, 4] const removedArr = immutableRemove(arr, 1); // [1, 3, 4]
1. Menguruskan Keadaan Tidak Berubah dalam Seni Bina Gaya Redux
const initialState = { todos: [] }; function reducer(state = initialState, action) { switch (action.type) { case "ADD_TODO": return { ...state, todos: [...state.todos, action.payload] }; case "REMOVE_TODO": return { ...state, todos: state.todos.filter((_, index) => index !== action.index), }; default: return state; } }
2. Mengelakkan Pepijat Rujukan dalam Fungsi Asynchronous
// Mutable Example const mutableArray = [1, 2, 3]; mutableArray.push(4); // The original array is modified console.log(mutableArray); // [1, 2, 3, 4] // Immutable Example const immutableArray = [1, 2, 3]; const newArray = [...immutableArray, 4]; // Creates a new array console.log(immutableArray); // [1, 2, 3] console.log(newArray); // [1, 2, 3, 4]
Kesimpulan
Ketidakbolehubahan dan memahami jenis rujukan adalah penting untuk menulis aplikasi JavaScript yang mantap dan boleh diselenggara. Dengan memanfaatkan fungsi utiliti dan mematuhi amalan terbaik, anda boleh menghalang pepijat, memudahkan pengurusan negeri dan membuat kod yang berskala dengan lancar.
Atas ialah kandungan terperinci Memahami Ketidakbolehubahan JavaScript dan Jenis Rujukan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!