欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

js中的賦值 淺拷貝和深拷貝詳細(xì)

 更新時間:2021年09月28日 16:29:26   作者:用戶bPcUQ3V  
js數(shù)據(jù)類型主要分基本數(shù)據(jù)類型和引用數(shù)據(jù)類型。前者包括Number,String等,后者主要是Object,因此以下會針對不同的數(shù)據(jù)類型來分析,需要的朋友可以參考一下

前言:

在學(xué)習(xí)下面文章前我們簡單了解一下的內(nèi)存的知識,以下先簡要提一下

1、js內(nèi)存

js內(nèi)存,或者說大部分語言的內(nèi)存都分為棧和堆?;緮?shù)據(jù)類型的變量值分配在棧上,引用數(shù)據(jù)類型的變量值分配在堆上,棧中只是存儲具體堆中對象的地址。

2、賦值

對于基本數(shù)據(jù)類型,賦值操作是拷貝,即新舊變量不會相互影響。

var a = 1;
var b = a;
b = 2;
console.log(b); // 2


對于引用數(shù)據(jù)類型,賦值操作只是在棧中新增一個指向堆中對象的變量,即復(fù)制引用地址。新舊變量之間會互相影響,即在新變量上改變對象值,舊變量對應(yīng)值也會改變。

var a = {
    name: "mike"
};
var b = a;
b.name = "jack";
console.log(a); // {name: "jack"}

3、淺拷貝

對于基本數(shù)據(jù)類型和不具有嵌套對象的數(shù)據(jù),均是拷貝操作,新舊變量之間不會相互影響。

var a = {
    name: "mike"
};
var b = {};
b.name = a.name;
b.name = "jack";
console.log(a) // {name: "mike"}

但是對于具有嵌套對象的數(shù)據(jù),淺拷貝只拷貝第一層對象,深層次的值仍然是復(fù)制引用地址。

var a = {
    name: "mike",
    language: {
        first: "english",
        second: "chinese"
    }
};
var b = {};
b.name = a.name;
b.name = "jack";
b.language = a.language;
b.language.first = "japanese"
console.log(a) // { language : {first: "japanese", second: "chinese"}}

js實現(xiàn)淺拷貝,思想:遍歷target的每個屬性,將起屬性名和值賦值給新變量。
如果你明白了賦值的含義,那么在代碼的第四行,當(dāng)此時的target[key]的值是對象的時候,通過賦值賦予新變量,本質(zhì)上是復(fù)制引用數(shù)據(jù)類型在堆中的地址,就不難理解為什么淺拷貝對于是否是嵌套對象的有不同結(jié)果了。

function shallowCopy(target) {
    let result = {};
    for (const key in target) {
        result[key] = target[key];
    }
    return result;
}

4、深拷貝

深拷貝是完完全全的拷貝,新舊變量之間不會相互影響。
對于參數(shù)是否是對象有不同的處理方法,如果是對象,對于對象的每個屬性和值賦值然后遞歸處理; 否則直接返回。

function clone(target) {
    if (typeof target === "object") {
        //判斷是否是數(shù)組
        let result = Array.isArray(target)? [] : {};
        for (const key in target) {
            result[key] = clone(target[key]);
        }
        return  result;
    } else {
        return target;
    }
}

到此這篇關(guān)于js中的賦值 淺拷貝和深拷貝詳細(xì)的文章就介紹到這了,更多相關(guān)js中的賦值 淺拷貝和深拷貝內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JavaScript前端學(xué)算法題解LeetCode最大重復(fù)子字符串

    JavaScript前端學(xué)算法題解LeetCode最大重復(fù)子字符串

    這篇文章主要為大家介紹了JavaScript前端學(xué)算法題解LeetCode最大重復(fù)子字符串,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • JS代碼檢查工具ESLint介紹與使用方法

    JS代碼檢查工具ESLint介紹與使用方法

    ESLint是一個JavaScript代碼靜態(tài)檢查工具,可以檢查JavaScript的語法錯誤,提示潛在的bug,本文將詳細(xì)介紹ESLint的使用方法
    2020-02-02
  • 微信小程序 122100版本更新問題解決方案

    微信小程序 122100版本更新問題解決方案

    這篇文章主要介紹了微信小程序 122100版本更新問題解決方案的相關(guān)資料,這里對微信小程序版本更新該如何解決提供解決方案,需要的朋友可以參考下
    2016-12-12
  • 微信小程序本地緩存數(shù)據(jù)增刪改查實例詳解

    微信小程序本地緩存數(shù)據(jù)增刪改查實例詳解

    這篇文章主要介紹了微信小程序本地緩存數(shù)據(jù)增刪改查實例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • 前端利用jsencrypt.js進(jìn)行RSA加密示例詳解

    前端利用jsencrypt.js進(jìn)行RSA加密示例詳解

    這篇文章主要為大家介紹了前端利用jsencrypt.js進(jìn)行RSA加密示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • Three.js相機Camera控件知識梳理

    Three.js相機Camera控件知識梳理

    這篇文章主要為大家介紹了Three.js相機Camera控件知識梳理,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • Js視頻播放器插件Video.js使用方法詳解

    Js視頻播放器插件Video.js使用方法詳解

    Video.js 是一個通用的在網(wǎng)頁上嵌入視頻播放器的JS庫,Video.js自動檢測瀏覽器對HTML5的支持情況,如果不支持HTML5則自動使用Flash 播放器,推薦大家好好看看
    2020-02-02
  • JS高級ES6的6種繼承方式

    JS高級ES6的6種繼承方式

    這篇文章主要和大家分享的事JS高級ES6的6種繼承方式,繼承是面向?qū)ο笾欣仙U劦囊粋€內(nèi)容,在ECMAScript6之前,JavaScript中的繼承可謂是非常的繁瑣的,有各種各樣的繼承,本質(zhì)上所有的繼承都是離不開原型鏈的,更多詳細(xì)內(nèi)容請感興趣的小伙伴參考下面文章內(nèi)容吧
    2021-12-12
  • JavaScript?history?對象詳解

    JavaScript?history?對象詳解

    這篇文章主要介紹了JavaScript?history?對象詳解,history?對象表示當(dāng)前窗口首次使用以來用戶的導(dǎo)航歷史記錄。因為?history?是?window?的屬性,所以每個?window?都有自己的?history?對象,更多詳細(xì)內(nèi)容請參考下面文章內(nèi)容
    2021-11-11
  • lodash內(nèi)部方法getData和setData實例解析

    lodash內(nèi)部方法getData和setData實例解析

    本篇章我們將了解lodash里內(nèi)部關(guān)于Data的操作方法,重點關(guān)注getData、setData兩個內(nèi)部方法,同時由實現(xiàn)上引申其他內(nèi)部封裝的方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08

最新評論