【JavaScript】面試手撕淺拷貝

【JavaScript】面試手撕淺拷貝

引入

淺拷貝和深拷貝應該是面試時非常常見的問題了,為了能將這兩者說清楚,于是打算用兩篇文章分別解釋下深淺拷貝。

PS: 我第一次聽到拷貝這個詞,有種莫名的熟悉感,感覺跟某個英文很相似,后來發現確實Copy的音譯,感覺這翻譯還是蠻有意思的。🐶

什么是淺拷貝

行文至此,肯定會有朋友問,什么事淺拷貝呢?顧名思義,就是淺淺的copy一下。🐶

JavaScript中,對于淺拷貝分為兩種情況。

  • 對于淺拷貝,如果待拷貝的數據是基礎類型的屬性(如NumberStringBoolean等基本類型),那么只需要將這個值直接復制過來即可
  • 對于淺拷貝,如果待拷貝的數據是引用類型的屬性(如對象,數組),那么復制的則是對象的引用以及第一層的基礎屬性值

基礎類型與引用類型的區別

談到這,順帶談一下基礎類型引用類型的區別。

基礎類型
  • 直接存儲在棧內存中。
  • 存儲的是實際的數據值。
  • 內存空間固定且較小。
引用類型
  • 對象(如數組,函數,對象等)的屬性值存在堆內存中。
  • 棧內存中存儲的是指向堆內存中對象的引用或指針,而非對象本身的內容。
  • 內存空間大小不固定,取決于對象結構的復雜性。

手動實現淺拷貝

因為值的拷貝可以直接賦值即可。我們這里實現下對象的淺拷貝。

對象的淺拷貝:復制對象的引用以及第一層屬性值。

思路: 我們先構造一個新對象,然后將它的屬性值等于原對象的屬性值。這里新對象和原對象的屬性依然會共享引用,但對于第一層的基礎屬性卻不會共享了。所以我們實現的淺拷貝 是拷貝一層。

function shallowClone(obj) {const newObj = {};for (let prop in obj) {if (obj.hasOwnProperty(prop)) {newObj[prop] = obj[prop];}}return newObj;
}const test = { a: 1, b: 2 };
const newTest = shallowClone(test);
newTest.a = 2;
console.log('test: ',test,' newTest: ', newTest);
/*** 輸入如下,第一層基礎屬性的值不會共享了* test:  { a: 1, b: 2 }  newTest:  { a: 2, b: 2 }*/

Js自帶淺拷貝的方法

對于Js的淺拷貝,可以分為對象淺拷貝數組淺拷貝

對象淺拷貝

對于對象的淺拷貝有object.assgin拓展運算符實現,這里的淺拷貝都是拷貝一層。

Object.assign

Object.assign()ES6 中引入的一個方法,用于將一個或多個源對象的所有可枚舉屬性分配到目標對象上。

const original = { a: 1, b: { c: 2 } };
const shallowCopy = Object.assign({}, original);
拓展運算符

注意:這種方式同樣會創建一個新的對象,但對嵌套對象或數組只會進行淺拷貝。

const original = { a: 1, b: { c: 2 } };
const shallowCopy = { ...original };

數組淺拷貝

slice

slice()方法是用來從數組中提取一部分元素生成新數組的方法,它確實實現了數組的淺拷貝。

let originalArray = [1, 2, { a: 3 }, [4, 5]];
let copiedArray = originalArray.slice();// 淺拷貝后,原始數組和拷貝數組中基本類型元素是獨立的
copiedArray[0] = 100; // 修改基本類型元素,不影響原數組
console.log(originalArray); // 輸出:[1, 2, { a: 3 }, [4, 5]]
console.log(copiedArray); // 輸出:[100, 2, { a: 3 }, [4, 5]]// 但是對于引用類型元素,修改其屬性或內容會同時影響原數組和拷貝數組
copiedArray[2].a = 456;
copiedArray[3][0] = 7;console.log(originalArray); // 輸出:[1, 2, { a: 456 }, [7, 5]]
console.log(copiedArray); // 輸出:[100, 2, { a: 456 }, [7, 5]]

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

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

相關文章

Linux文本處理三劍客:awk(內置函數詳解筆記)

Linux系統中,AWK 是一個非常強大的文本處理工具,它的內置函數使得對文本數據進行處理更加高效和便捷。 本文將介紹 AWK 內置函數的幾種主要類型: 算數函數字符串函數時間函數位操作函數其他常用函數 我們將使用一個示例文本文件來演示這些函…

局域網如何搭建服務器?

隨著網絡的普及和應用場景的不斷拓展,局域網搭建服務器逐漸成為大家關注的話題。在日常生活和工作中,我們經常需要通過局域網和互聯網進行文件共享、資源訪問等操作,而搭建服務器則是實現這些功能的重要手段之一。本文將針對局域網搭建服務器…

SwiftUI 如何在運行時從底層動態獲取任何 NSObject 對象實例

概覽 眾所周知,SwiftUI 的推出極大地方便了我們這些禿頭碼農們搭建 App 界面。不過,有時我們仍然需要和底層的 UIKit 對象打交道。比如:用 SwiftUI 未暴露出對象的接口改變視圖的行為或外觀。 從上圖可以看到,我們 SwiftUI 代碼并沒有設置視圖的背景色,那么它是怎么變成綠…

vscode 本地/遠程添加python解釋器

文章目錄 1. 背景2. 增加python解釋器 1. 背景 我們在使用 vscode 去遠程調試代碼時,如果環境存在多個 Python 版本(如用 conda 管理),沒有選擇正確的 Python 解釋器會導致少包、庫不適配等各種問題 2. 增加python解釋器 windo…

鴻蒙系統適配的流程

鴻蒙系統適配的流程通常涉及以下關鍵步驟,以下是鴻蒙系統適配的一般流程,具體流程可能會根據項目的具體需求和開發團隊的情況進行調整和優化。北京木奇移動技術有限公司,專業的軟件外包開發公司,歡迎交流合作。 1. 準備工作&#…

超越脆弱:用否定法策略優化考研復試準備

很多情況下,你的想象力會為當前的世界添加一些東西。很抱歉,我會在本章中告訴你,這種方法完全是落后的方法:根據脆弱性和反脆弱性的概念,嚴格來說,正確的想象就是從未來中排除或削減不屬于未來的東西,采用否定法,脆弱的事物終將破碎。——《反脆弱:從不確定性中獲益》…

盤點:國家智能算力中心

文章目錄 1. Main2. My thoughtsReference 1. Main 按照《中國算力白皮書(2022年)》的定義,算力主要分為四部分:通用算力、智能算力、超算算力、邊緣算力。通用算力以CPU芯片輸出的計算能力為主;智能算力以GPU、FPGA、…

【一起學習Arcade】(6):屬性規則實例_約束規則和驗證規則

一、約束規則 約束規則用于指定要素上允許的屬性配置和一般關系。 與計算規則不同,約束規則不用于填充屬性,而是用于確保要素滿足特定條件。 簡單理解,約束規則就是約束你的編輯操作在什么情況下可執行。 如果出現不符合規則的操作&#…

CGI中使用Cookie

文章目錄 CGI中使用Cookiecookie的語法設置Cookie獲取Cookie檢索Cookie信息文件上傳實例1. 創建HTML表單2. 編寫Python腳本處理上傳 文件下載對話框 CGI中使用Cookie 在CGI(Common Gateway Interface)中使用Cookie涉及設置和獲取由Web服務器發送到瀏覽器…

java導出多個xml文件的壓縮zip

代碼: // 設置響應頭response.setCharacterEncoding("UTF-8");//設置響應的字符編碼為UTF-8response.setContentType("application/octet-stream");//設置響應的內容類型為二進制流,通常用于文件下載。response.setHeader("Con…

解釋一下前端框架中的虛擬DOM(virtual DOM)和實際DOM(real DOM)之間的關系。

聚沙成塔每天進步一點點 ? 專欄簡介 前端入門之旅:探索Web開發的奇妙世界 歡迎來到前端入門之旅!感興趣的可以訂閱本專欄哦!這個專欄是為那些對Web開發感興趣、剛剛踏入前端領域的朋友們量身打造的。無論你是完全的新手還是有一些基礎的開發…

leetcode日記(36)全排列

想思路想了很久……思路對了應該會很好做。 我的思路是這樣的&#xff1a;只變化前n個數字&#xff0c;不斷增加n&#xff0c;由2到nums.size()&#xff0c;使用遞歸直到得到所有結果 代碼如下&#xff1a; class Solution { public:vector<vector<int>> permut…

正信法律:借款糾紛的民事起訴狀怎么寫

在借款糾紛中&#xff0c;當協商無果時&#xff0c;訴諸法律成為債權人追回債務的有效途徑。而民事起訴狀作為啟動訴訟程序的法律文書&#xff0c;其撰寫質量直接關系到案件的受理與判決。本文旨在簡明扼要地闡述如何撰寫一份規范的借款糾紛民事起訴狀。 起訴狀需包含以下幾個關…

阿克曼轉向車型導航末段位姿調整控制

1目標 分析RPP算法時控制器算法學習1-RPP受控純追蹤算法發現,在終點時如果角度還有較大偏差,該算法無法進行很好的調整,故開始嘗試在末端接近目標點時,用自己的控制算法去調整位姿,姑且命名為TEA算法(Target-End-Adjust Algorithm for Ackermann) 2控制思路 step1. 將…

【百度】B端數據中臺組_大數據研發工程師(J68899)

北京市技術3人2023-12-14 工作職責&#xff1a; 負責百家號和Feed相關大數據的基礎建設負責數倉引擎、Spark底層的優化和基礎建設為百度系APP相關業務分析及策略優化提供大數據支持參與百度系APP日志數據架構開發和APP端性能分析平臺建設 職責要求&#xff1a; 本科及以上學…

C# Onnx segment-anything 分割萬物 一鍵摳圖

目錄 介紹 效果 模型信息 sam_vit_b_decoder.onnx sam_vit_b_encoder.onnx 項目 代碼 下載 C# Onnx segment-anything 分割萬物 一鍵摳圖 介紹 github地址&#xff1a;https://github.com/facebookresearch/segment-anything The repository provides code for runn…

設計模式(十二)享元模式

請直接看原文: 原文鏈接:設計模式&#xff08;十二&#xff09;享元模式-CSDN博客 -------------------------------------------------------------------------------------------------------------------------------- 享元模式定義 享元模式是結構型設計模式的一種&am…

Kubernetes-1

學習Kubernetes第一天 k8s-11、什么是Kubernetes2、配置Kubernetes2.1、準備三臺全新的虛擬機2.2、關閉防火墻和SElinux2.3、修改主機名2.4、升級操作系統(三臺一起操作)2.5、配置主機hosts文件&#xff0c;相互之間通過主機名互相訪問2.6、配置master和node之間的免密通道2.7、…

KMP算法和Manacher算法

KMP算法 KMP算法解決的問題 KMP算法用來解決字符串匹配問題: 找到長串中短串出現的位置. KMP算法思路 暴力比較與KMP的區別 暴力匹配: 對長串的每個位,都從頭開始匹配短串的所有位. KMP算法: 將短字符串前后相同的部分存儲在 n e x t next next數組里,讓之前匹配過的信息指…

我的單片機入門之旅

我的單片機入門之旅 前言 單片機作為現代電子技術的重要組成部分&#xff0c;廣泛應用于各個領域。而作為一個初學者&#xff0c;我對單片機一無所知。但是&#xff0c;通過不斷的學習和實踐&#xff0c;我逐漸掌握了單片機的基本概念和使用方法。在我的單片機入門之旅中&…