JavaScript進階(十二)

第三部分:JavaScript進階

目錄

第三部分:JavaScript進階

十二、深淺拷貝

12.1 淺拷貝

12.2 深拷貝

1. 通過遞歸實現深拷貝

2. js庫lodash里面cloneDeep內部實現了深拷貝

3. 通過JSON.stringify()實現

十三、異常處理

13.1 throw拋異常

13.2 try /catch捕獲異常

13.3 debugger

十四、處理this

14.1 this指向

1. 普通函數this指向

2. 箭頭函數this指向

14.2 改變this

1. call() - 了解

2. apply() - 理解

3. bind() - 重點

call apply bind 總結

十五、性能優化

15.1 防抖

15.2 節流

十六、節流綜合案例

案例-頁面打開,可以記錄上一次的視頻播放位置

十二、深淺拷貝

開發中我們經常需要復制一個對象。如果直接用賦值會有下面問題:


 

12.1 淺拷貝

首先淺拷貝和深拷貝只針對引用類型

淺拷貝:拷貝的是地址常見方法

常見方法:

  1. 拷貝對象:Object.assgin() / 展開運算符...obj} 拷貝對象
  2. 拷貝數組:Array.prototype.concat() 或者[..arr]
     

總結:

1. 直接賦值和淺拷貝有什么區別?

  • 直接賦值的方法,只要是對象,都會相互影響,因為是直接拷貝對象棧里面的地址
  • 淺拷貝如果是一層對象,不相互影響,如果出現多層對象拷貝還會相互影響

2. 淺拷貝怎么理解?

  • 拷貝對象之后,里面的屬性值是簡單數據類型直接拷貝值
  • 如果屬性值是引用數據類型則拷貝的是地址
     

12.2 深拷貝

首先淺拷貝和深拷貝只針對引用類型

深拷貝:拷貝的是對象,不是地址

常見方法:

1. 通過遞歸實現深拷貝
2. lodash/cloneDeep
3. 通過JSON.stringify()實現
 

1. 通過遞歸實現深拷貝

函數遞歸:如果一個函數在內部可以調用其本身,那么這個函數就是遞歸函數

  • 簡單理解:函數內部自己調用自己,這個函數就是遞歸函數
  • 遞歸函數的作用和循環效果類似
  • 由于遞歸很容易發生“棧溢出”錯誤(stack overflow),所以必須要加退出條件return
     

練習-利用遞歸函數實現setTimeout模擬setInterval效果

需求:
①頁面每隔-秒輸出當前的時間
②輸出當前時間可以使用:new Date().toLocaleString()


 

通過遞歸函數實現深拷貝(簡版):

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head><body><script>const obj = {uname: 'pink',age: 18,hobby: ['乒乓球', '足球'],family: {baby: '小pink'}}const o = {}// 拷貝函數function deepCopy(newObj, oldObj) {debuggerfor (let k in oldObj) {// 處理數組的問題  一定先寫數組 在寫 對象 不能顛倒if (oldObj[k] instanceof Array) {newObj[k] = []//  newObj[k] 接收 []  hobby//  oldObj[k]   ['乒乓球', '足球']deepCopy(newObj[k], oldObj[k])} else if (oldObj[k] instanceof Object) {newObj[k] = {}deepCopy(newObj[k], oldObj[k])}else {//  k  屬性名 uname age    oldObj[k]  屬性值  18// newObj[k]  === o.uname  給新對象添加屬性newObj[k] = oldObj[k]}}}deepCopy(o, obj) // 函數調用  兩個參數 o 新對象  obj 舊對象console.log(o)o.age = 20o.hobby[0] = '籃球'o.family.baby = '老pink'console.log(obj)console.log([1, 23] instanceof Object)// 復習// const obj = {//   uname: 'pink',//   age: 18,//   hobby: ['乒乓球', '足球']// }// function deepCopy({ }, oldObj) {//   // k 屬性名  oldObj[k] 屬性值//   for (let k in oldObj) {//     // 處理數組的問題   k 變量//     newObj[k] = oldObj[k]//     // o.uname = 'pink'//     // newObj.k  = 'pink'//   }// }</script>
</body></html>

2. js庫lodash里面cloneDeep內部實現了深拷貝

Lodash網址:Lodash 簡介 | Lodash中文文檔 | Lodash中文網


 

3. 通過JSON.stringify()實現


 

總結:

1. 實現深拷貝三種方式?

    本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
    如若轉載,請注明出處:http://www.pswp.cn/pingmian/82011.shtml
    繁體地址,請注明出處:http://hk.pswp.cn/pingmian/82011.shtml
    英文地址,請注明出處:http://en.pswp.cn/pingmian/82011.shtml

    如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

    相關文章

    大疆制圖跑飛馬D2000的正射與三維模型

    1 問題描述 大疆制圖在跑大疆無人機飛的影像的時候&#xff0c;能夠自動識別相機參數并且影像自帶pos信息&#xff0c;但是用飛馬無人機獲取的影像pos信息與影像是分開的&#xff08;飛馬無人機數據處理有講&#xff09;&#xff0c;所以在用大疆制圖時需要對相機參數進行設置…

    探索服務網格(Service Mesh):云原生時代的網絡新范式

    文章目錄 一、引言二、什么是服務網格基本定義形象比喻 三、服務網格解決了哪些問題微服務通信復雜性可觀察性安全性 四、常見的服務網格實現IstioLinkerdConsul Connect 五、服務網格的應用場景大型微服務架構混合云環境 六、服務網格的未來發展與其他技術的融合標準化和行業規…

    Electron+vite+vue3 從0到1搭建項目,開發Win、Mac客戶端

    隨著前端技術的發展&#xff0c;出現了所謂的大前端。 大前端則是指基于前端技術延伸出來的各種終端平臺及應用場景&#xff0c;包括APP、桌面端、手表終端、服務端等。 本篇文章主要是和大家一起學習一下使用Electron 如何打包出 Windows 和 Mac 所使用的客戶端APP&#xff…

    【DevSecOps】從零到一:用OpenAI Codey與Trivy打造智能化安全掃描 CI/CD 流水線實戰

    背景與動機 核心概念&#xff1a;DevSecOps、OpenAI Codey 與 Trivy 什么是 DevSecOpsOpenAI Codey&#xff08;Codex&#xff09;概覽Trivy 掃描器簡介 架構設計與技術選型 流水線實戰&#xff1a;GitHub Actions 集成示例 多平臺適配&#xff1a;GitLab CI 與 Azure DevO…

    Swagger、Springfox、Springdoc-openapi 到底是什么關系

    記得剛開始想在 SpringBoot 應用中使用 Swagger 生成 API 文檔時&#xff0c;在 Swagger 官網上想找如何在 SpringBoot 中使用的指導&#xff0c;結果肯定是找不到&#xff0c;因為當時不清楚 Swagger 的定位是什么&#xff0c;只知道可以用它生成 API 文檔。所以就想寫這篇文章…

    目標檢測DINO-DETR(2023)詳細解讀

    文章目錄 對比去噪訓練混合查詢選擇look forward twice 論文全稱為&#xff1a;DETR with Improved DeNoising Anchor Boxes for End-to-End Object Detection 提出了三個新的方法&#xff1a; 首先&#xff0c;為了改進一對一的匹配效果&#xff0c;提出了一種對比去噪訓練方法…

    深度學習-162-DeepSeek之調用遠程大模型API接口參數結構分析

    文章目錄 1 文本對話請求1.1 請求參數1.1.1 參數說明1.1.2 參數總結1.2 返回參數1.2.1 id1.2.2 choices1.2.3 usage1.2.4 created1.2.5 model1.2.6 object1.2.7 參數總結2 應用示例2.1 調用大模型API2.2 返回結果3 參考附錄分析文本對話請求v1/chat/completions的參數結構含義。…

    uniapp原生插件

    前言 使用uniapp開發Android app時&#xff0c;一些特定的需求沒辦法實現的時候就只能開發原生插件或者uts插件去滿足需求&#xff0c;我的需求目前uts插件沒法實現&#xff0c;只能靠原生插件了&#x1f606; 需求&#xff1a;拍照不保存圖片到相冊&#xff0c;uniapp的API或…

    CVE-2024-42323

    漏洞名稱 Apache HertzBeat SnakeYaml 反序列化遠程代碼執行漏洞&#xff08;CVE-2024-42323&#xff09; 漏洞描述 Apache HertzBeat 是一款開源的實時監控告警工具&#xff0c;支持對操作系統、中間件、數據庫等多種對象進行監控&#xff0c;并提供 Web 界面進行管理。 在…

    “人工智能+多學科”選題思路,2025熱點AI+(180個)

    給大家整理了一份超全的論文資料合集 不僅有論文創新點的干貨知識、開題報告模板、文獻綜述模板、審稿意見回復模板、還有全套的SCI論文寫作指導教程和人工智能各方向經典的論文合集以及各大熱門科研和論文寫作潤色工具等 以及1000G人工智能資料包&#xff08;如下圖&#xff…

    LangChain4j入門AI(八)使用RAG增加私有知識庫

    前言 我們通過提示詞工程提升了通用LLM的專業知識水平&#xff0c;并結合Function Calling構建了私有業務能力。為了在實際應用中有效維護私有領域的專有數據&#xff0c;我們進一步采用大模型微調或RAG檢索增強技術&#xff0c;使LLM能夠充分掌握私有知識庫的內容。 一、微調…

    使用arXiv.org上的資源進行學術研究

    arXiv.org e-Print archive arXiv.org 是一個收集物理學、數學、計算機科學、定量生物學、定量金融學和統計學等領域學術論文預印本的網站&#xff0c;其使命是促進科學文獻的傳播與交流。以下是關于該網站的詳細介紹&#xff1a; 核心定位與功能 學術預印本平臺&#xff1a…

    Redis 中的緩存擊穿、緩存穿透和緩存雪崩是什么?

    在 Redis 中&#xff0c;緩存擊穿、緩存穿透和緩存雪崩是常見的緩存問題&#xff0c;它們都會影響系統的性能和穩定性。以下是針對這三個問題的詳細解釋&#xff1a; 一、緩存擊穿&#xff08;Cache Breakdown&#xff09; 定義&#xff1a;緩存擊穿是指某個熱點數據在緩存中…

    RabbitMQ配置環境變量

    一、RabbitMQ下載 1、從官網下載 在官網中下載&#xff0c;適合自己電腦的版本。我直接下載的windows版本。 然后下載opt這個軟件這個版本適合3.6.3的RabbitMQ&#xff0c;點擊藍色的字體即可下載。 2、安裝erlang 當你雙擊安裝程序并進入安裝向導后&#xff0c;會看到這樣…

    基于vue框架的東莞市二手相機交易管理系統5yz0u(程序+源碼+數據庫+調試部署+開發環境)帶論文文檔1萬字以上,文末可獲取,系統界面在最后面。

    系統程序文件列表 項目功能&#xff1a;用戶,相機分類,二手相機 開題報告內容 基于FlaskVue框架的東莞市二手相機交易管理系統開題報告 一、研究背景與意義 1.1 研究背景 隨著數字技術的迅猛發展和攝影文化的廣泛普及&#xff0c;相機已成為人們記錄生活、表達創意的重要工…

    dify調用Streamable HTTP MCP應用

    一、概述 上一篇文章&#xff0c;介紹了使用python開發Streamable HTTP MCP應用&#xff0c;鏈接&#xff1a;https://www.cnblogs.com/xiao987334176/p/18872195 接下來介紹dify如何調用MCP 二、插件 安裝插件 需要安裝2個插件&#xff0c;分別是&#xff1a;Agent 策略(支持 …

    筆記:將一個文件服務器上的文件(一個返回文件數據的url)作為另一個http接口的請求參數

    筆記&#xff1a;將一個文件服務器上的文件&#xff08;一個返回文件數據的url&#xff09;作為另一個http接口的請求參數 最近有這么個需求&#xff0c;需要往某一個業務的外部接口上傳文件信息&#xff0c;但是現在沒有現成的文件&#xff0c;只在數據庫存了對應的url&#…

    如何在 FastAPI 中合理使用 Pydantic 的 Alias

    下面的內容是我跟 Gemini 2.5 Pro 探討關于Pydantic 的 Alias 問題之后&#xff0c;讓它總結的一篇技術博客。 我已經有很長一段時間沒有好好寫技術類的博客了&#xff0c;這就是原因。 可以在 https://panzhixiang.cn/ 查看更多我的博客&#xff0c;有技術的&#xff0c;也有很…

    CAU人工智能class4 批次歸一化

    歸一化 在對輸入數據進行預處理時會用到歸一化&#xff0c;將輸入數據的范圍收縮到0到1之間&#xff0c;這有利于避免綱量對模型訓練產生的影響。 但當模型過深時會產生下述問題&#xff1a; 當一個學習系統的輸入分布發生變化時&#xff0c;這種現象稱之為“內部協變量偏移”…

    動態庫和靜態庫詳解

    庫其實就是個文件 下面是文件后綴 靜態庫&#xff1a;.a(linux) .lib(windows) 動態庫&#xff1a;.so(linux) .dll(windows) 靜態庫的制作 ar -rc libmystdio.a my_stdio.o my_string.o ar是歸檔工具&#xff0c;rc表示replace和create&#xff0c;ar跟tar有點…