1. 程式人生 > >Javascript實現深拷貝的方法

Javascript實現深拷貝的方法

淺拷貝

要想理解深拷貝,我們先來看一下淺拷貝,廢話不多說,直接上程式碼

var obj = { a:1, arr: [2,3] };
var shallowObj = shallowCopy(obj);

function shallowCopy(src) {
  var dst = {};
  for (var prop in src) {
    if (src.hasOwnProperty(prop)) {
      dst[prop] = src[prop];
    }
  }
  return dst;
}

看這個例子,我們把obj物件直接拷貝給了shallowObj,不過這樣有什麼問題呢,比如我們再給shallowObj增加一個屬性name:

shallowObj.arr.push('qing');
console.log(shallowObj);
console.log(obj)

這裡寫圖片描述

可以看到obj也隨著發生了改變

因為淺複製只會將物件的各個屬性進行依次複製,並不會進行遞迴複製,而 JavaScript 儲存物件都是存地址的,所以淺複製會導致obj.arr 和 shallowObj.arr 指向同一塊記憶體地址。

大概的示意圖如下
這裡寫圖片描述

深拷貝

  • 遞迴實現
var people = {
     name:'xxx',
        friends:['people1','people2','peopple3'
], info:{ phone:'133xxxxxxxx', age:'18', sex:'man' } } function deepCopy(p, c) {   var c = c || {};     for (var i in p) {       if (typeof p[i] === 'object') {         c[i] = (p[i].constructor === Array) ? [] : {};         deepCopy(p[i], c[i]);       } else
{          c[i] = p[i];       }     }     return c;   } var person = deepCopy(people);
  • JSON實現
var result = JSON.parse(JSON.stringify(people))

我們給兩種方法得到的新物件增加方法

person.friends.push('qing');
result.friends.push('Leon');

可以看到結果如下
這裡寫圖片描述
所以原物件不會隨著深拷貝過的物件而改變,深拷貝不僅將原物件的各個屬性逐個複製出去,而且將原物件各個屬性所包含的物件也依次採用深複製的方法遞迴複製到新物件上

相關推薦

Javascript實現拷貝方法

淺拷貝 要想理解深拷貝,我們先來看一下淺拷貝,廢話不多說,直接上程式碼 var obj = { a:1, arr: [2,3] }; var shallowObj = shallowCopy(obj); function shallowCopy(src)

【JS】拷貝與淺拷貝的區別,實現拷貝的幾種方法

如何區分深拷貝與淺拷貝,簡單點來說,就是假設B複製了A,當修改A時,看B是否會發生變化,如果B也跟著變了,說明這是淺拷貝,拿人手短,如果B沒變,那就是深拷貝,自食其力。 此篇文章中也會簡單闡述到棧堆,基本資料型別與引用資料型別,因為這些概念能更好的讓你理解深拷貝與淺拷貝。 我們來舉個淺拷貝例

拷貝、淺拷貝區別,實現拷貝方法

如何區分深拷貝與淺拷貝,簡單點來說,就是假設B複製了A,當修改A時,看B是否會發生變化,如果B也跟著變了,說明這是淺拷貝,拿人手短,如果B沒變,那就是深拷貝,自食其力。 此篇文章中也會簡單闡述到棧堆,基本資料型別與引用資料型別,因為這些概念能更好的讓你理解深拷貝與淺拷貝。 我們來舉個淺拷貝例

實現拷貝的各種方法

實現深拷貝的各種方法: 1.使用ES6的語法 var a=[1,2,3] var b=[...a] b.push(4); console.log(b);//1,2,3,4 console.log(a)//1,2,3 2.使用concat()方法 var a=[1,2,3]

C#拷貝擴充套件方法(引用型別利用序列化實現拷貝)

/// <summary> /// 深拷貝 /// 注意:T必須標識為可序列化[Serializable] /// </summary> /// <typeparam name="T">

JavaScript JSON 物件拷貝方法(一例)

其實深拷貝一個JS物件方法十分簡單,只需要兩部 1.首先將JS物件序列化為JSON格式 2.然後再將JSON轉化為JS物件。 //任意一個複雜的JS物件 var obj = [1,23,4,{name:'名字',value:"數值"}];  //將這個JS物件序列化為一個J

javascript 陣列 拷貝的簡易方法(通過concat)

如下程式碼,a變化了 var a = [1,2,3] var b = a; b[2] =10; console.log(a); 如下程式碼,使用concat 發下a沒有變化 var a = [1,2,3] var b = a.concat(); b

c#實現拷貝的幾種方法

代碼 序列 技術 ack [] ffffff .com ref val   為什麽要用到深拷貝呢?比如我們建了某個類Person,並且實例化出一個對象,然後,突然需要把這個對象復制一遍,並且復制出來的對象要跟之前的一模一樣,來看下我們一般會怎麽做,看代碼    publ

Java的一個高性能快速拷貝方法。Cloneable?

object row 核心 pie interface 傳統 循環 nod json-lib 本人在設計數據庫緩存層的時候,需要對數據進行深拷貝,這樣用戶操作的數據對象就是不共享的。 這個思路實際上和Erlang類似,就是用數據不共享解決並發問題。 1. 序列化? 原來

javaScript拷貝與淺拷貝

func array efi name 內存空間 數據 xtend 是否 -- js中有兩種數據類型: 1. 基本類型 : Number、String、Boolean、Null、Undefined 2. 復雜類型 : Object 、Ar

利用序列化和反序列化實現拷貝

實現 turn one span format class pos 反序 isp 以下都是有缺陷的。 1 private static T BinDeepCopy<T>(T t) 2 { 3 using(va

JavaScript拷貝和淺拷貝

復制 nsh book 並不會 turn 字符串 重要 jce 兩種 原文   簡書原文:https://www.jianshu.com/p/3d930756dd8f 大綱   前言  1、對深拷貝和淺拷貝的初步認識  2、深拷貝和淺拷貝的區別  3、淺拷貝存在的缺陷  4

js實現拷貝

font all != 賦值 class function style pro return   js的數據類型分為基本數據類型和引用數據類型。基本數據類型是直接賦值,引用數據類型分為淺拷貝和深拷貝。淺拷貝是復制對象的指針,深拷貝是復制對象所有屬性再內存中獨立存在。   淺

【js】拷貝和淺拷貝區別,以及實現拷貝的方式

一、區別:簡單點來說,就是假設B複製了A,當修改A時,看B是否會發生變化,如果B也跟著變了,說明這是淺拷貝,如果B沒變,那就是深拷貝。 此篇文章中也會簡單闡述到棧堆,基本資料型別與引用資料型別,因為這些概念能更好的讓你理解深拷貝與淺拷貝。 例如: let a=[0,1,2,3,4], b=

JavaScript拷貝和淺拷貝

前言 工作中會經常遇到運算元組、物件的情況,你肯定會將原陣列、物件進行‘備份’當真正對其操作時發現備份的也發生改變,此時你一臉懵逼,到時是為啥,不是已經備份了麼,怎麼備份的陣列、物件也會發生變化。如果你對拷貝原理理解的不透徹,此文或許能提供一點幫助。 javascript資料型別 基本資料型別 string、

詳解javaScript拷貝

目錄 淺談深拷貝和淺拷貝 深拷貝和淺拷貝的區別 為什麼要使用深拷貝? 深拷貝的要求程度 怎麼檢驗深拷貝成功 只對第一層級做拷貝 拷貝所有層級 存在大量深拷貝需求的程式碼——immutab

利用遞歸實現拷貝(常見面試題之一)

利用 實現思路 參數 面試題 由於 遞歸實現 但是 log 對象 淺拷貝和深拷貝的區別: 淺拷貝 : 只是將數據中所有的數據引用下來,依舊指向同一個存放地址,拷貝之後的數據修改之後,也會影響到原數據的中的對象數據 深拷貝: 將數據中所有的數據拷貝下來,對拷貝之後的數據進行修

手動實現拷貝

手動實現深拷貝的三種方法: // 方法一 Object.prototype.deepClone = function () { let objClone = Array.isArray(this) ? [] : {} if (this && typeof thi

js淺拷貝拷貝方法

js有五種基本資料型別,string,number,boolean,null,undefind。這五種型別的賦值,就是值傳遞。物件的賦值是將物件地址的引用賦值。這時候修改物件中的屬性或者值,會導致所以引用這個物件的值改變。如果想要真的複製一個新的物件,而不是複製物件

js陣列遞迴實現拷貝

js的拷貝分深拷貝和淺拷貝 在淺拷貝中。for和呼叫自身建構函式的方法 在深拷貝中,最常見的有呼叫json函式 json.parse(json.pstringity()) 還有一種是呼叫for迴圈雙層for 例如: <script> var arr=[[1,2,3