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

JavaScript之深度克隆、多種實現(xiàn)方式、列舉各種方式的優(yōu)缺點、對象自有屬性、拷貝、復制

這篇具有很好參考價值的文章主要介紹了JavaScript之深度克隆、多種實現(xiàn)方式、列舉各種方式的優(yōu)缺點、對象自有屬性、拷貝、復制。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。


源數(shù)據(jù)

class Test {
    constructor() {
        this.a = 1;
        this.b = 2;
    }

    c() {
        console.log('c');
    }
};

Test.prototype.d = 1;
const obj = new Test();
obj.h = obj;

正統(tǒng)深克隆

// 循環(huán)引用的克隆
// 防止遞歸的無限執(zhí)行
// 避免報錯
// 避免內(nèi)存泄漏
const cache = new WeakMap();

function orthDeepClone(value) {
    // 函數(shù)不需要克隆
    // 會進入此判斷并直接返回
    if (typeof value !== 'object' || value === null) return value;
    // 判斷緩存是否存在當前值
    // 有的話返回結果
    // 沒有就繼續(xù)往下執(zhí)行
    if (cache.has(value)) return cache.get(value);

    // 創(chuàng)建數(shù)組或?qū)ο?/span>
    // 可以添加Map等其他對象
    const result = Array.isArray(value) ? [] : {};

    // 設置result的原型為value的原型
    // 如果不設置
    // 當克隆類的時候返回的是普通對象
    Object.setPrototypeOf(result, Object.getPrototypeOf(value));
    // 設置緩存
    cache.set(value, result);
    for (const key in obj) {
        // 不確定數(shù)據(jù)類型時使用
        // if (Object.hasOwnProperty.call(obj, key)) result[key] = orthDeepClone(obj[key]);

        // 確定數(shù)據(jù)類型時使用
        // 只克隆value的自有屬性
        // 原型上的屬性不參與克隆
        if (value.hasOwnProperty(key)) result[key] = orthDeepClone(obj[key]);
    }

    return result;
}

console.log(orthDeepClone(obj));
// Test {a: 1, b: 2, h: Test}

JSON深克隆

function JSONDeepClone(value) {
    return JSON.parse(JSON.stringify(value));
}

console.log(JSONDeepClone(obj));
// 報錯
// Uncaught TypeError: Converting circular structure to JSON

JavaScript中,對象和數(shù)組是引用類型,當將一個對象或數(shù)組賦值給另一個變量時,它們實際上是共享同一塊內(nèi)存空間。這意味著對一個對象或數(shù)組的修改會影響到所有引用它的變量。
為了創(chuàng)建一個獨立的副本,可以使用深克隆。JSON.stringify()方法將JavaScript對象轉(zhuǎn)換為一個JSON字符串,然后使用 JSON.parse()方法將該字符串解析為一個新的JavaScript對象。通過這種方式,創(chuàng)建了一個完全獨立的副本,對其中一個對象的修改不會影響到另一個對象。
需要注意的是,這種方法僅適用于可以被JSON表示的數(shù)據(jù)類型,例如對象、數(shù)組字符串、數(shù)字、布爾值null。它不能復制函數(shù)、正則表達式、Date對象等特殊類型的值。
文章來源地址http://www.zghlxwxcb.cn/news/detail-783196.html

到了這里,關于JavaScript之深度克隆、多種實現(xiàn)方式、列舉各種方式的優(yōu)缺點、對象自有屬性、拷貝、復制的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

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

領支付寶紅包贊助服務器費用

相關文章

  • 防抖和節(jié)流及多種實現(xiàn)方式

    當用戶在網(wǎng)頁中進行操作時,如點擊、滾動、輸入等,往往會頻繁地觸發(fā)事件。如果每個事件都立即執(zhí)行相應的函數(shù),可能會導致性能問題和用戶體驗不佳,因為這些函數(shù)可能需要執(zhí)行復雜的操作,如計算、網(wǎng)絡請求等。 為了優(yōu)化這種情況,我們可以使用防抖和節(jié)流來限制函

    2023年04月24日
    瀏覽(19)
  • Linux實現(xiàn)查看文件內(nèi)容的多種方式

    Linux實現(xiàn)查看文件內(nèi)容的多種方式

    目錄 1、more:分屏顯示文件內(nèi)容。 2、less:文本內(nèi)容查看器 3、head -n:顯示文件前n行到終端 4、tail -n:顯示文件后n行到終端 5、實現(xiàn)實時查看文件內(nèi)容(追蹤文件) ? ? ? ? 除了使用vi/vim 編輯器查看文件內(nèi)容和使用cat命令將文件所有內(nèi)容展示到終端上以外,還有多種方式。

    2024年02月12日
    瀏覽(32)
  • vue實現(xiàn)導出excel的多種方式

    在Vue中實現(xiàn)導出Excel有多種方式,可以通過前端實現(xiàn),也可以通過前后端配合實現(xiàn)。下面將詳細介紹幾種常用的實現(xiàn)方式。 使用 xlsx 庫:使用 xlsx 庫可以在前端將數(shù)據(jù)導出為Excel文件。首先需要安裝 xlsx 庫,然后在Vue組件中引入并使用該庫來處理數(shù)據(jù)并導出Excel文件。以下是一

    2024年02月11日
    瀏覽(25)
  • SpringBoot實現(xiàn)文件下載的多種方式

    1.1 下載文件

    2024年02月06日
    瀏覽(22)
  • Python實現(xiàn)猜拳小游戲的多種方式

    猜拳小游戲是一個經(jīng)典的小游戲項目,也是初學者學習編程的必要練手題目之一。在 Python 中,我們可以使用多種方式來實現(xiàn)一個簡單的猜拳小游戲。 本文將依次介紹六種Python實現(xiàn)猜拳小游戲的方法,包括:使用 if-else 條件語句、使用 random 模塊、使用字典映射勝負關系、f

    2024年02月08日
    瀏覽(33)
  • unity多種方式實現(xiàn)文件選擇和保存窗口

    unity多種方式實現(xiàn)文件選擇和保存窗口

    編輯器的模式,可以利用EditorUtility類里面的方式實現(xiàn),需要引用UnityEditor命名空間。 此種方式只支持在編輯器模式下運行,因為帶有UnityEditor命名空間,故發(fā)布成exe之后不能使用。 首先需要引用 System.Windows.Forms 命名空間。 引用System.Windows.Forms報錯 報錯的是原因是缺少System

    2024年02月10日
    瀏覽(24)
  • springboot實現(xiàn)ES多種分頁方式

    es有兩種分頁方式 from+size 淺分頁 scroll 深分頁 在這里就不展開介紹了,網(wǎng)絡上有很多相關介紹。 我們還可以通過維護 自增主鍵來實現(xiàn)分頁 下面結合Springboot,通過代碼展現(xiàn)實現(xiàn)es分頁的三種實現(xiàn)方式 需要引入依賴: 代碼: ESBase.java UserIdxES.java UserIdx.java UserIdxESReq.java 測試

    2024年02月10日
    瀏覽(18)
  • C++進程間通信的多種方式及實現(xiàn)

    1、管道(Pipe):是一種半雙工的通信方式,適用于具有親緣關系的兩個進程之間的通信。管道分為匿名管道和命名管道。 上述代碼中,先調(diào)用pipe()函數(shù)創(chuàng)建了一個管道,并在fork()函數(shù)中創(chuàng)建了一個子進程。父進程向管道中寫入一條消息,子進程從管道中讀取該消息并輸出到

    2024年02月15日
    瀏覽(13)
  • 前端實現(xiàn)下載文件的各種方式

    前端實現(xiàn)下載文件的各種方式

    前端涉及到的文件下載還是很多應用場景的,那么前端文件下載有多少種方式呢?每種方式有什么優(yōu)缺點呢?下面就來一一介紹。 通過 a 標簽的 download 屬性來實現(xiàn)文件下載,這種方式是最簡單的,也是我們比較常用的方式,先來看示例代碼: 就上面的這個示例,我們點擊下

    2024年02月16日
    瀏覽(21)
  • C#面:列舉ASP.NET頁面之間傳遞值的幾種方式

    查詢字符串(Query String): 可以通過在URL中添加參數(shù)來傳遞值。 例如:http://example.com/page.aspx?id=123 在接收頁面中可以通過Request.QueryString[“id”]來獲取傳遞的值。 會話狀態(tài)(Session State): 可以使用Session對象在不同頁面之間存儲和檢索值。 在發(fā)送頁面中可以使用Session[“k

    2024年02月19日
    瀏覽(19)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領取紅包

二維碼2

領紅包