本篇文章為大家介紹JavaScript中合併和克隆物件的方法。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有幫助。
當我們想要複製原始值和引用值(物件)時,它們的行為會大不相同。
原始值
我們假設一個變數name
# 具有一個與之關聯的原始值(number,string,boolean,undefined 和null) 。如果我們將此變數 name
複製到另一個變數name2
,則原始變數的任何修改都不會影響到第二個變量,因為它們是原始值。
let name="前端小智"; let name2= name; console.log (name, name2); // 前端小智, 前端小智 name="王大冶"; console.log (name,name2); // 王大冶 前端小智
引用值
但是,如果我們對引用類型的值進行相同的操作,則我們對一個變數所做的任何更改也將反映在另在一個變數中,因為兩個變數都指向同一物件。
陣列
要拷貝數組,slice()
方法用於建立數組的新副本。可以獨立修改此副本,而不會影響原始陣列。
如果未傳遞任何參數,則它會精確複製數組,但數字也可以作為參數傳遞。如果僅傳遞一個數字,它將確定我們要從其複製的索引的值,而如果傳遞兩個數字,則將標記開始和結束。
// 示例1 const names = ['前端小智', '王大冶', '小力']; const names2 = names; console.log(names, names2); // ["前端小智", "王大冶", "小力"] // ["前端小智", "王大冶", "小力"] // 示例2 names2[2] = '前端小力'; console.log(names, names2); // ["前端小智", "王大冶", "前端小力"] // ["前端小智", "王大冶", "前端小力"] // 示例3 const name2 = names.slice(); names[2] = '我是隔壁老智'; console.log(name2, names2) // ["前端小智", "王大冶", "前端小力"] // ["前端小智", "王大冶", "我是隔壁老智"]
物件
當引用值是物件時,也會發生相同的情況,對其屬性之一的任何修改都會影響這兩個變數。若要複製對象,請使用Object.assign()
方法,該方法會將一個或多個來源對象的所有可枚舉屬性的值複製到目標對象,但是此方法僅對對象的一個淺拷貝。
// 示例1 const names = { name: '前端小智', surname: '隔壁老智' } const names2 = names; console.log(names, names2) // 打印结果是一模一样的 // 示例2 names2.surname ='隔壁老王'; console.log(names, names2) // {name: "前端小智", surname: "隔壁老王"} // {name: "前端小智", surname: "隔壁老王"} // 示例3 const names3 = Object.assign({}, names); names3.surname = '隔壁老色P'; console.log(names, names3) // {name: "前端小智", surname: "隔壁老王"} // {name: "前端小智", surname: "隔壁老色P"}
要對物件進行深拷貝,需要使用其他方法。
正如我們所說,Object.assign()
方法只是一個淺拷貝(即,當我們的物件沒有其他物件作為屬性時)才有效。在這些情況下,必須對物件進行深拷貝。
與淺拷貝不同,深拷貝以遞歸方式複製每個子對象,直到所有涉及的物件都複製為止。
我們可以用什麼方法複製物件的深層副本?
JSON.parse(JSON.stringify(obj))
#此方法使用JSON.stringify()
將物件轉換為字串,然後再用JSON.parse()
將其轉換回物件。此方法對簡單物件有效,但如果物件屬性是函數時無效。
const names = { name: '前端小智', surname: '隔壁老智', social: { wx: '大迁世界', url: 'www.lsp.com' } } const names2 = JSON.parse(JSON.stringify(names)); names2.social.url = 'www.baidu.com'; console.log(names, names2); /** { name: "前端小智" social: {wx: "大迁世界", url: "www.lsp.com"} surname: "隔壁老智" } */ /** { name: "前端小智" social: {wx: "大迁世界", url: "www.baidu.com"} surname: "隔壁老智" } */
深度拷貝
另一種非常有趣且優雅的物件深度複製方法是使用遞歸函數。
我們建立了一個deepClone(object)
函數,將想要複製的物件作為參數傳遞給它。在函數內部,將建立一個局部變數克隆,這是一個空對象,其中將從起始對象克隆的每個屬性都將添加到該對像中。
具體想法:
- 如果該屬性不是對象,則將其簡單地克隆並添加到新的克隆對像中。
- 如果屬性是對象,則再次執行
deepClone(value)
函數,並將屬性的值(在這種情況下為對象)作為參數傳遞,並重複相同的過程。
function deepClone(object) { var clone = {}; for (var key in object) { var value = object[key]; if (typeof(value) !== 'object') { clone[key] = value; } else { clone[key]=deepClone(value); } } return clone; } deepClone({value1:1,value2:{value3:2}}); //{value1:1,value2:{value3:2}} deepClone({value1:1,value2:{value3:{value3b:3}}}); //{value1:1,value2:{value3:{value3b:3}}}
英文原文網址:https://www.ma-o.org/en/programming/javascript/the-javascript-asign-method-to-merge-and-clone -objects
作者:Luigi Nori
譯者:前端小智
更多程式相關知識,請造訪:程式設計影片 ! !
以上是一文了解JavaScript中合併和克隆物件的方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

JavaScript是現代網站的核心,因為它增強了網頁的交互性和動態性。 1)它允許在不刷新頁面的情況下改變內容,2)通過DOMAPI操作網頁,3)支持複雜的交互效果如動畫和拖放,4)優化性能和最佳實踐提高用戶體驗。

C 和JavaScript通過WebAssembly實現互操作性。 1)C 代碼編譯成WebAssembly模塊,引入到JavaScript環境中,增強計算能力。 2)在遊戲開發中,C 處理物理引擎和圖形渲染,JavaScript負責遊戲邏輯和用戶界面。

JavaScript在網站、移動應用、桌面應用和服務器端編程中均有廣泛應用。 1)在網站開發中,JavaScript與HTML、CSS一起操作DOM,實現動態效果,並支持如jQuery、React等框架。 2)通過ReactNative和Ionic,JavaScript用於開發跨平台移動應用。 3)Electron框架使JavaScript能構建桌面應用。 4)Node.js讓JavaScript在服務器端運行,支持高並發請求。

Python更適合數據科學和自動化,JavaScript更適合前端和全棧開發。 1.Python在數據科學和機器學習中表現出色,使用NumPy、Pandas等庫進行數據處理和建模。 2.Python在自動化和腳本編寫方面簡潔高效。 3.JavaScript在前端開發中不可或缺,用於構建動態網頁和單頁面應用。 4.JavaScript通過Node.js在後端開發中發揮作用,支持全棧開發。

C和C 在JavaScript引擎中扮演了至关重要的角色,主要用于实现解释器和JIT编译器。1)C 用于解析JavaScript源码并生成抽象语法树。2)C 负责生成和执行字节码。3)C 实现JIT编译器,在运行时优化和编译热点代码,显著提高JavaScript的执行效率。

JavaScript在現實世界中的應用包括前端和後端開發。 1)通過構建TODO列表應用展示前端應用,涉及DOM操作和事件處理。 2)通過Node.js和Express構建RESTfulAPI展示後端應用。

JavaScript在Web開發中的主要用途包括客戶端交互、表單驗證和異步通信。 1)通過DOM操作實現動態內容更新和用戶交互;2)在用戶提交數據前進行客戶端驗證,提高用戶體驗;3)通過AJAX技術實現與服務器的無刷新通信。

理解JavaScript引擎內部工作原理對開發者重要,因為它能幫助編寫更高效的代碼並理解性能瓶頸和優化策略。 1)引擎的工作流程包括解析、編譯和執行三個階段;2)執行過程中,引擎會進行動態優化,如內聯緩存和隱藏類;3)最佳實踐包括避免全局變量、優化循環、使用const和let,以及避免過度使用閉包。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。