摘要:深拷貝與淺拷貝的區(qū)別如何區(qū)分深拷貝與淺拷貝,簡單點來說,就是假設(shè)復(fù)制了,當(dāng)修改時,看是否會發(fā)生變化,如果也跟著變了,說明這是淺拷貝,拿人手短,如果沒變,那就是深拷貝,自食其力。
1.深拷貝與淺拷貝的區(qū)別
如何區(qū)分深拷貝與淺拷貝,簡單點來說,就是假設(shè)B復(fù)制了A,當(dāng)修改A時,看B是否會發(fā)生變化,如果B也跟著變了,說明這是淺拷貝,拿人手短,如果B沒變,那就是深拷貝,自食其力。
2.棧堆、基本數(shù)據(jù)類型、引用數(shù)據(jù)類型
棧堆:存放數(shù)據(jù)的地方
基本數(shù)據(jù)類型:number,string,boolean,null,undefined.
引用數(shù)據(jù)類型(Object類)有常規(guī)名值對的無序?qū)ο髙a:1},數(shù)組[1,2,3],以及函數(shù)等。
3.淺拷貝
let a= [0,1,2,3,4],b=a; console.log(a===b); a[0] = 1 console.log(a,b)
3.深拷貝
function deepClone(obj){ let objClone = Array.isArray(obj)?[]:{}; if(obj && typeof obj==="object"){ for(key in obj){ if(obj.hasOwnProperty(key)){ //判斷ojb子元素是否為對象,如果是,遞歸復(fù)制 if(obj[key]&&typeof obj[key] ==="object"){ objClone[key] = deepClone(obj[key]); }else{ //如果不是,簡單復(fù)制 objClone[key] = obj[key]; } } } } return objClone; } let a=[1,2,3,4],b=deepClone(a); a[0]=2; console.log(a,b);
4.引用類型和基本類型棧內(nèi)存儲
4.1基本類型
4.2引用類型
5.JS中拷貝Array的slice和concat方法
5.1.slice拷貝
var a = [1,2,3]; var b = a.slice(); //slice console.log(b === a); a[0] = 4; console.log(a); console.log(b);
5.2.concat拷貝
var a = [1,2,3]; var b = a.concat(); //concat console.log(b === a); a[0] = 4; console.log(a); console.log(b);
看到結(jié)果,如果你覺得,這兩個方法是深拷貝,那就恭喜你跳進了坑里!
來看看有意思的例子吧
var a = [[1,2,3],4,5]; var b = a.slice(); console.log(a === b); a[0][0] = 6; console.log(a); console.log(b);
可以看到slice和contact對于第一層是深拷貝,但對于多層的時候,是復(fù)制的引用,所以是淺拷貝
6.JSON 對象的 parse 和 stringify都是深拷貝
var obj = {name:"cancan",age:23,company : { name : "阿里", address : "杭州"} }; var obj_json = JSON.parse(JSON.stringify(obj)); console.log(obj === obj_json); obj.company.name = "cancan82"; obj.name = "haha"; console.log(obj); console.log(obj_json);
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/97846.html
摘要:在之前的文章專題之?dāng)?shù)據(jù)類型和類型檢測中我有講過,中的數(shù)據(jù)類型分為兩種,基本數(shù)據(jù)類型和引用數(shù)據(jù)類型,基本數(shù)據(jù)類型是保存在棧的數(shù)據(jù)結(jié)構(gòu)中的是按值訪問,所以不存在深淺拷貝問題。 前言 在開發(fā)過程中,偶爾會遇到這種場景,拿到一個數(shù)據(jù)后,你打算對它進行處理,但是你又希望拷貝一份副本出來,方便數(shù)據(jù)對比和以后恢復(fù)數(shù)據(jù)。 那么這就涉及到了 JS 中對數(shù)據(jù)的深淺拷貝問題,所謂深淺拷貝,淺拷貝的意思就是,...
摘要:為何寫最近在研究深淺拷貝,找了很多資料,感覺不是很滿意,所以自己就整理了一份。深拷貝如果給放到新的內(nèi)存中,將的各個屬性都復(fù)制到新內(nèi)存里,就是深拷貝。安全的值是指能夠呈現(xiàn)為有效格式的值。參考文檔冴羽的專題之深淺拷貝深拷貝與淺拷貝的實現(xiàn) 為何寫: 最近在研究深淺拷貝,找了很多資料,感覺不是很滿意,所以自己就整理了一份。廢話不多說,我們來一起復(fù)習(xí)一下吧,也希望留下您寶貴意見。 何為深淺拷貝?...
摘要:專題系列第六篇,講解深淺拷貝的技巧和以及實現(xiàn)深淺拷貝的思路前言拷貝也是面試經(jīng)典吶數(shù)組的淺拷貝如果是數(shù)組,我們可以利用數(shù)組的一些方法比如返回一個新數(shù)組的特性來實現(xiàn)拷貝。所以我們可以看出使用和是一種淺拷貝。 JavaScript 專題系列第六篇,講解深淺拷貝的技巧和以及實現(xiàn)深淺拷貝的思路 前言 拷貝也是面試經(jīng)典吶! 數(shù)組的淺拷貝 如果是數(shù)組,我們可以利用數(shù)組的一些方法比如:slice、co...
摘要:深拷貝相比于淺拷貝速度較慢并且花銷較大。所以在賦值完成后,在棧內(nèi)存就有兩個指針指向堆內(nèi)存同一個數(shù)據(jù)。結(jié)果如下擴展運算符只能對一層進行深拷貝如果拷貝的層數(shù)超過了一層的話,那么就會進行淺拷貝那么我們可以看到和展開原算符對于深淺拷貝的結(jié)果是一樣。 JS中數(shù)據(jù)類型 基本數(shù)據(jù)類型: undefined、null、Boolean、Number、String和Symbol(ES6) 引用數(shù)據(jù)類型:...
摘要:動手實現(xiàn)深拷貝利遞歸來實現(xiàn)對對象或數(shù)組的深拷貝。遞歸思路對屬性中所有引用類型的值進行遍歷,直到是基本類型值為止。深拷貝只對對象自有屬性進行拷貝測試數(shù)據(jù)拷貝方式其實也是一種繼承的方式,當(dāng)然繼承還是有其他方法的感謝支持 深淺拷貝 基本類型 & 引用類型 ECMAScript中的數(shù)據(jù)類型可分為兩種: 基本類型:undefined,null,Boolean,String,Number,Symb...
閱讀 1718·2021-10-18 13:34
閱讀 3906·2021-09-08 10:42
閱讀 1551·2021-09-02 09:56
閱讀 1606·2019-08-30 15:54
閱讀 3127·2019-08-29 18:44
閱讀 3298·2019-08-26 18:37
閱讀 2212·2019-08-26 12:13
閱讀 453·2019-08-26 10:20