国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【JavaScript】面試手撕深拷貝

這篇具有很好參考價值的文章主要介紹了【JavaScript】面試手撕深拷貝。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。


【JavaScript】面試手撕深拷貝,JavaScript,javascript,面試,開發(fā)語言
【JavaScript】面試手撕深拷貝,JavaScript,javascript,面試,開發(fā)語言

??個人主頁: 鑫寶Code
??熱門專欄: 閑話雜談| 炫酷HTML | JavaScript基礎(chǔ)
???個人格言: "如無必要,勿增實體"

【JavaScript】面試手撕深拷貝,JavaScript,javascript,面試,開發(fā)語言


【JavaScript】面試手撕深拷貝,JavaScript,javascript,面試,開發(fā)語言

引入

上次講了淺拷貝,這次我們來講深拷貝。有一說一,深拷貝也算是面試時非常常見的題目了。??

深拷貝的作用

首先為什么需要深拷貝,因為淺拷貝無法滿足我們對原始數(shù)據(jù)完整、獨立復制的需求。我們希望修改新對象不會影響原對象。

深淺拷貝的區(qū)別

這里引用ConardLi大佬的理解

淺拷貝

創(chuàng)建一個新對象,這個對象有著原始對象屬性值的一份精確拷貝。

  • 如果屬性是基本類型,拷貝的就是基本類型的值.
  • 如果屬性是引用類型,拷貝的就是內(nèi)存地址

所以如果其中一個對象改變了這個地址,就會影響到另一個對象。

【JavaScript】面試手撕深拷貝,JavaScript,javascript,面試,開發(fā)語言
深拷貝

將一個對象從內(nèi)存中完整的拷貝一份出來

  • 從堆內(nèi)存中開辟一個新的區(qū)域存放新對象
  • 且修改新對象不會影響原對象
【JavaScript】面試手撕深拷貝,JavaScript,javascript,面試,開發(fā)語言

深拷貝實現(xiàn)方式

JSON.parse(JSON.stringify())

遙記當年,我當時還是大三的時候,背了一周的面經(jīng)就跑去字節(jié)面試實習生了。面試官就讓我手撕深拷貝。

我當時才20剛出頭,前端面經(jīng)也才抱起來背了不到一周。這種題目我寫的來得?

跟面試官面面相覷了半天,突然靈機一動,JSON.parse(JSON.stringfy())大法一定可以。

我當時非常開心的說出了這個答案, 面試官當時好像有點尬住了,嘴角流露出一股察摸不到的笑容。

但可能由于接受過專業(yè)的訓練,也只在那短短的時間內(nèi)便消失不見。??

【JavaScript】面試手撕深拷貝,JavaScript,javascript,面試,開發(fā)語言【JavaScript】面試手撕深拷貝,JavaScript,javascript,面試,開發(fā)語言

介紹

JSON.parse(JSON.stringify()),首先使用利用JSON.stringify將對象轉(zhuǎn)成JSON字符串。 再用JSON.parse把字符串解析成對象,一去一來,新的對象產(chǎn)生了,而且對象會開辟新的棧,實現(xiàn)深拷貝。

使用例子
const a = {
    name: '張三',
    score:{
        math: 100
    }
}

const b = JSON.parse(JSON.stringify(a));

// 改變b中的對象的值
b.score.math = 60;

console.log('a的值',a);
console.log('b的值',b);

/**
 * 輸出的結(jié)果如下
 * a的值 { name: '張三', score: { math: 100 } }
 * b的值 { name: '張三', score: { math: 60 } }
 */
缺點

記個TODO:下次寫文章詳細分析下JSON.stringify的缺點。

  • 不會拷貝對象上為undefined的值
  • 不能處理函數(shù)
  • 不能處理正則
  • 循環(huán)引用會報錯
  • Symol會丟失等

Lodash的cloneDeep

續(xù)借上文,面試官笑了笑,說JSON.parse(JSON.stringify())這個方式有如上幾個缺點,你能不能換個更好的方式將這個問題解決呢?

這又一次的讓我陷入了思索,又開始了與面試官的面面相覷??。突然我想起了以前用的Lodash,其中有一個NB的方法。cloneDeep,當時我洋洋得意,心想lodash庫的方法,總不可能還有缺點吧?

此時,面試官的表情稍稍有點微妙,我的第六感告訴我,我好像答錯了,不過我認為我回答的沒問題呀。

晌久,面試官嘆了口氣說,我是讓你手撕,手撕懂嗎?

【JavaScript】面試手撕深拷貝,JavaScript,javascript,面試,開發(fā)語言【JavaScript】面試手撕深拷貝,JavaScript,javascript,面試,開發(fā)語言

介紹

_.cloneDeeplodash庫提供的深拷貝的方法,非常實用,建議背誦??。

使用例子
import * as _ from "lodash";

const a = {
  name: "張三",
  score: {
    math: 100,
  },
};

const b = _.cloneDeep(a);
缺點

暫無,??的lodash庫,??的cloneDeep函數(shù)。

手撕深拷貝

誒,還是得手撕呀,來吧來吧,還是得給面試官露一手的??

基礎(chǔ)版本

多年面試經(jīng)驗告訴我,一般寫出這個版本,幾乎都讓過了,頂多在回答一下循環(huán)引用問題如何解決。一般不太會讓寫一個比較完美的深拷貝的。??

  1. 首先,我們要拷貝的數(shù)據(jù)類型有兩種,分別是ArrayObject
  2. 如果對象里的屬性還是對象,那么采用遞歸對這個對象再進行拷貝
  3. 如果對象里的屬性不是對象,那么直接返回即可。

代碼如下:

function deepClone(target) {
  if (typeof target === "object") {
    let cloneTarget = Array.isArray(target) ? [] : {};
    for (const key in target) {
      cloneTarget[key] = deepClone(target[key]);
    }
    return cloneTarget;
  } else {
    return target;
  }
}

const a = {
  name: "張三",
  score: {
    math: 100,
  },
};

const b = deepClone(a);
/** 輸出的b與a一樣 **/

但是這樣實現(xiàn)會有若干個問題:

  1. 循環(huán)引用問題無法解決
  2. DateRegExp等對象無法拷貝

進階版本

之所以用weakMap,是因為weakMap的鍵是弱引用,可以在任何時刻被回收。

如果想了解更清楚進階深拷貝的原理,可以參閱 如何寫出一個驚艷面試官的深拷貝?

function deepClone(target, hash = new WeakMap()) {
  if (target === null) return null;
  if (typeof target !== "object") return target;
  if (target instanceof Date) return new Date(target);
  if (target instanceof RegExp) return new RegExp(target);
  // 如果hash里有值,立馬返回
  if (hash.has(target)) return hash.get(target);

  const cloneTarget = Array.isArray(target) ? [] : {};

  hash.set(target,cloneTarget);

  if (typeof target === "object") {
    for (const key in target) {
      cloneTarget[key] = deepClone(target[key],hash);
    }
    return cloneTarget;
  } else {
    return target;
  }
}

const a = {
  name: "張三",
  score: {
    math: 100,
  },
  date: new Date(),
  regex: /^\d{3,4}-\d{5,8}$/,
};

a.child = a;

const b = deepClone(a);

運行結(jié)果如下:

【JavaScript】面試手撕深拷貝,JavaScript,javascript,面試,開發(fā)語言

參考資料

如何寫出一個驚艷面試官的深拷貝?

淺拷貝與深拷貝

【JavaScript】面試手撕深拷貝,JavaScript,javascript,面試,開發(fā)語言

【JavaScript】面試手撕深拷貝,JavaScript,javascript,面試,開發(fā)語言文章來源地址http://www.zghlxwxcb.cn/news/detail-839278.html

到了這里,關(guān)于【JavaScript】面試手撕深拷貝的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務器費用

相關(guān)文章

  • 【JavaScript】手撕前端面試題:手寫Object.create | 手寫Function.call | 手寫Function.bind

    【JavaScript】手撕前端面試題:手寫Object.create | 手寫Function.call | 手寫Function.bind

    ??? NodeJS專欄:Node.js從入門到精通 ??? 博主的前端之路(源創(chuàng)征文一等獎作品):前端之行,任重道遠(來自大三學長的萬字自述) ??? TypeScript知識總結(jié):TypeScript從入門到精通(十萬字超詳細知識點總結(jié)) ?????個人簡介:大三學生,一個不甘平庸的平凡人?? ??

    2024年02月21日
    瀏覽(42)
  • 手撕前端面試題【javascript~ 總成績排名、子字符串頻次統(tǒng)計、繼承、判斷斐波那契數(shù)組等】

    手撕前端面試題【javascript~ 總成績排名、子字符串頻次統(tǒng)計、繼承、判斷斐波那契數(shù)組等】

    html頁面的骨架,相當于人的骨頭,只有骨頭是不是看著有點瘆人,只有HTML也是如此。 css,相當于把骨架修飾起來,相當于人的皮肉。 js(javascripts),動起來,相當于人的血液,大腦等一切能使人動起來的器官或者其他的。 在刷題之前先介紹一下??汀eetcode有的刷題??投加?,

    2024年01月15日
    瀏覽(30)
  • JavaScript深拷貝(js深拷貝,JavaScript遞歸函數(shù),實現(xiàn)深拷貝)

    JavaScript深拷貝(js深拷貝,JavaScript遞歸函數(shù),實現(xiàn)深拷貝)

    簡述:JavaScript的深拷貝和淺拷貝大家都比較熟悉,今天來分享下深拷貝,就是使用該函數(shù)時,會復制拷貝一份該數(shù)據(jù),修改該數(shù)據(jù)屬性,不會改變原有數(shù)據(jù),就是把復制的對象所引用的對象全都復制了一遍,具體實現(xiàn)如下; 1、定義拷貝對象; 2、定義遞歸函數(shù)deepClone(),實現(xiàn)

    2024年02月15日
    瀏覽(21)
  • 開發(fā)語言漫談-JavaScript

    ? ? ? ?JavaScript、Java名字很相近,但它們沒有任何親緣關(guān)系,是由不同公司開發(fā)的編程語言。Java由Sun公司(后被Oracle收購)開發(fā),JavaScript最初是由Netscape公司開發(fā)的(當年瀏覽器的霸主)。JavaScript最初的名字是 LiveScript,Netscape將其命名為 JavaScript,無非是蹭?Java流量。當

    2024年04月16日
    瀏覽(26)
  • JavaScript深淺拷貝

    1. js淺拷貝只是創(chuàng)建了一個新的對象,復制了原有對象的基本類型的值。 手寫實現(xiàn) ?2. 深拷貝的原理和實現(xiàn) 將一個對象從內(nèi)存中完整地拷貝出來一份給目標對象,并從堆內(nèi)存中開辟一個全新的空間存放新的對象,且新對象的修改并不會改變原對象,二者實現(xiàn)真正的分離

    2024年01月18日
    瀏覽(19)
  • JavaScript深淺拷貝的幾種方式

    深淺拷貝主要是針對于引用類型而言的 1. JSON.parse(JSON.strigify(Str)) JSON.stringify() 該方法用于將一個字轉(zhuǎn)換為JSON字符串,該字符串符合JSON格式,并且可以被JSON.parse()方法還原。 對于原始類型的字符串,轉(zhuǎn)換結(jié)果會帶雙引號 如果要轉(zhuǎn)換的對象的屬性是undefined,函數(shù)或xml對象,該

    2024年01月19日
    瀏覽(22)
  • 深入探索前端之道:JavaScript深拷貝與淺拷貝的解析與實現(xiàn)

    前端開發(fā)中,數(shù)據(jù)的復制是一個常見的操作。尤其是在處理對象和數(shù)組時,我們需要考慮的是一個淺拷貝還是深拷貝。那么,什么是深拷貝和淺拷貝?它們在前端開發(fā)中有什么作用?如何實現(xiàn)這兩種拷貝?這是我們在本文將討論的問題。 淺拷貝 淺拷貝是一種數(shù)據(jù)復制方式,

    2024年02月10日
    瀏覽(24)
  • 建站系列(五)--- 前端開發(fā)語言之HTML、CSS、JavaScript

    建站系列(五)--- 前端開發(fā)語言之HTML、CSS、JavaScript

    建站系列(一)— 網(wǎng)站基本常識 建站系列(二)— 域名、IP地址、URL、端口詳解 建站系列(三)— 網(wǎng)絡協(xié)議 建站系列(四)— Web服務器之Apache、Nginx 建站系列(五)— 前端開發(fā)語言之HTML、CSS、JavaScript 建站系列(六)— 后端開發(fā)語言 建站系列(七)— 常用前后端框架

    2024年02月09日
    瀏覽(27)
  • JavaScript之深度克隆、多種實現(xiàn)方式、列舉各種方式的優(yōu)缺點、對象自有屬性、拷貝、復制

    在 JavaScript 中,對象和數(shù)組是引用類型,當將一個對象或數(shù)組賦值給另一個變量時,它們實際上是共享同一塊內(nèi)存空間。這意味著對一個對象或數(shù)組的修改會影響到所有引用它的變量。 為了創(chuàng)建一個獨立的副本,可以使用深克隆。 JSON.stringify() 方法將 JavaScript 對象轉(zhuǎn)換為一個

    2024年02月02日
    瀏覽(35)
  • (自己動手開發(fā)自己的語言練手級應用)JSON(JavaScript Object Notation) 產(chǎn)生式(BNF)

    ?寫自己的開發(fā)語言時,很多人都會拿JSON當?shù)谝粋€練習對象 開源net json FJSON 解析工具 https://dbrwe.blog.csdn.net/article/details/107611540?spm=1001.2014.3001.5502 以上是JSON的簡化產(chǎn)生式表示形式。其中, json 是最頂層的規(guī)則,可以是一個對象或一個數(shù)組。 object 表示一個對象,由一對大括號

    2024年02月10日
    瀏覽(28)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包