淺拷貝和深拷貝的概念及方法

来源:https://www.cnblogs.com/toweiwei/archive/2022/08/27/16629847.html
-Advertisement-
Play Games

淺拷貝 只拷貝第一層的值,其他後面拷貝的是地址。 示例 使用u盤在一臺電腦上拷貝文件,使用淺拷貝拷貝的相當於快捷方式。 第一層兩個內容不一樣,其他每層都是指向同一個文件 實現淺拷貝的方法 Object.assign (實現淺拷貝) let obj = { user:{ name: " jack" } ...


淺拷貝

只拷貝第一層的值,其他後面拷貝的是地址。

示例

使用u盤在一臺電腦上拷貝文件,使用淺拷貝拷貝的相當於快捷方式。

第一層兩個內容不一樣,其他每層都是指向同一個文件

實現淺拷貝的方法

Object.assign (實現淺拷貝)

let obj = {
user:{
name:
"
jack"
}
}
//assign實現淺拷貝
let copyObj = Object.assign({},obj)
copyObj.user.name = 'tom'
console.log(obj.user.name);
console.log(copyObj.user == obj.user);//true

Array.prototype.concat

let arr = [
{name:'jack'}
]
//利用concat方法實現對應的淺拷貝
let copyArr = arr.concat()
console.log(arr[0] == copyArr[0]);
console.log(copyArr == arr); //false

 

 

 Array.prototype.slice

//slice 截取方法
let sliceArr = arr.slice(0)
console.log(arr[0] == sliceArr[0]);
console.log(sliceArr == arr); //false...

...擴展運算符實現

//開闢一個新的變數
let newArr = [...arr]
console.log(newArr[0] == arr[0]);
console.log(newArr == arr); //false

使用第三方的插件 lodash.js _.clone方法實現

//實現淺拷貝
let obj1 = {
user:{
name:
"
jack"
}
}
let copyObj1 = _.clone(obj1)
console.log(copyObj1.user == obj1.user);//true
console.log(copyObj1 == obj1);//false

深拷貝

每層都進行值拷貝

示例

使用u盤在一臺電腦上拷貝文件,將文件所有複製一份,在粘貼一份。這倆份文件除了值是一致的,其
他都不一樣。倆者的地址是獨立的。

實現方式

使用字元串轉換(序列化 JSON.stringify 和反序列化 JSON.parse)

let obj = {
users:[{
name:
'
jack'
}]
}
//每層都只拷貝值 每層的地址都不一樣
// 字元串轉換 序列化和反序列化
let copyObj = JSON.parse(JSON.stringify(obj))
console.log(copyObj == obj); //false
console.log(copyObj.users == obj.users); //false
console.log(copyObj.users[0] == obj.users[0]); //false
console.log(copyObj.users[0].name == obj.users[0].name); //true

使用lodash 裡面_.cloneDeep

//使用第三方lodash _.cloneDeep方法實現
let cloneObj = _.cloneDeep(obj)
console.log(cloneObj == obj); //false
console.log(cloneObj.users == obj.users); //false
console.log(cloneObj.users[0] == obj.users[0]); //false
console.log(cloneObj.users[0].name == obj.users[0].name); //true

使用遞歸實現對應的深拷貝(面試題)

思路

  • 根據傳入的對象 進行判斷 如果不是對象直接賦值

  • 如果是對象就要先創建一個對象 那麼就需要判斷是數組還是對象 如果是數組創建數組 如果是對象就創建對象

  • 如果是數組獲或者是對象 取出裡面的值進行遞歸賦值

function deepClone(target) {
//如果傳入的目標對象是空就直接返回
if (!target) return {}
let copyObj = {} //接收拷貝好的對象
//根據typeOf的返回值進行判斷 判斷是否為對象
if (typeof target == 'object') {
//判斷是否為數組
copyObj = target instanceof Array ? [] : {}
//遍歷所有的key加入到對應的copyObj裡面
for (let key in target) {
//將對應的值和key加入到對應的copyObj裡面
copyObj[key] = deepClone(target[key])
}
} else {
copyObj = target //直接賦值
}
return copyObj
}

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 概述 Redis 在 3.0 之後開始支持 Cluster(集群)模式,特點如下: 支持節點的自動發現:可向集群動態添加節點,並自動融入 支持 slave-master 選舉和容錯:多個 master 宕機後,選舉出新的 master 繼續工作 線上分片:當有新的節點加入時,為新節點分配 slot ...
  • 摘要:今天給大家帶來一篇MySQL資料庫崩潰的修複案例 本文分享自華為雲社區《記一次MySQL崩潰修複案例,再也不用刪庫跑路了》,作者: 冰 河。 問題描述 研究MySQL源代碼,調試並壓測MySQL源代碼時,MySQL崩潰了!問題是它竟然崩潰了!而且還損壞了InnoDB文件!!還好是在調試環境下發 ...
  • 如何去掉vue的url地址中的#號?及其原理? 點擊打開視頻講解更加詳細 如何去掉vue的url地址中的#號? import Vue from 'vue'; import VueRouter from 'vue-router'; Vue.use(VueRouter) // 1. 定義一些路由 // ...
  • ##Query 是一個 JavaScript 函數庫。 jQuery 是一個輕量級的"寫的少,做的多"的 JavaScript 庫。 jQuery 庫包含以下功能: HTML 元素選取 HTML 元素操作 CSS 操作 HTML 事件函數 JavaScript 特效和動畫 HTML DOM 遍歷和修 ...
  • 1、axios的二次封裝 BiliBili作者原地址,多多支持 npm i axios //下載axios 首先創建兩個文件夾在src目錄下;api和config 先在config文件夾下建立一個index.js;具體代碼如下 export default{ baseUrl:{ dev: "http ...
  • 對象及日期定時器 Date日期 日期對象的定義(使用new關鍵詞) 1.獲取當前的時間(本地的時間) var date = new Date() //不傳參就是獲取當前時間 2.獲取指定的時間 var date = new Date(123456) //一個參數毫秒值 將這個毫秒值去加上對應的197 ...
  • 字元串 字元串 字元串也是一個數據結構,將同樣的內容串在一塊。因為在對應的js裡面字元串屬於一個值類型(值類型是常量 常量是不能變)。字元串是不能改變的。結合數據結構裡面串也是一個存儲結構,作為存儲結構增刪改查的方法(字元串的增刪改查 不能針對於本身 而是返回一個新的字元串) 字元串的聲明 1.值類 ...
  • 數組 數據結構 數據的結構 (邏輯結構 存儲結構 演算法) 存儲結構 (數據存儲的結構方式) 線性結構 數組(順序表) 隊列 棧 堆 鏈表 非線性結構 樹 圖hash (散列表) 只要是能存數據的容器 就必須具備增刪改查的方法 數組 數組概述:數組固定一類數據的組合(一般情況下我們數組裡面的數據類型一 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...