1. 程式人生 > >物件與陣列的深拷貝

物件與陣列的深拷貝

什麼是深拷貝和淺拷貝

1)深拷貝在計算機中開闢了一塊記憶體地址用於存放拷貝的物件,
2)而淺拷貝僅僅是指向被拷貝的記憶體地址,如果原地址中物件被改變了,那麼淺拷貝出來的物件也會相應改變。

深拷貝和淺拷貝最根本的區別在於是否是真正獲取了一個物件的拷貝實體,而不是引用。

物件和陣列佔用記憶體較大,直接複製會發生引用。這個時候就需要深拷貝,來實現拷貝。防止發生引用

陣列

對於ES6 陣列有兩種新的拷貝方法  防止發生引用

1. Array.from();

var arr1=[1,2,3];
var arr2=Array.from(arr1);

2.

var arr1=[1,2,3];
var arr2=[...arr1];

物件

此處只記錄一種最簡單的深拷貝方法。

var obj = { name:"John", sex:"male" };  //需要深拷貝的物件。

var str = JSON.stringify(obj) ;//把此物件轉化為字串。

var newObj = JSON.parse(str);//再把字串形式的物件轉回物件得到的新物件即可滿足深拷貝;不會產生引用。

相關推薦

物件陣列拷貝

什麼是深拷貝和淺拷貝 1)深拷貝在計算機中開闢了一塊記憶體地址用於存放拷貝的物件, 2)而淺拷貝僅僅是指向被拷貝的記憶體地址,如果原地址中物件被改變了,那麼淺拷貝出來的物件也會相應改變。 深拷貝和淺拷貝最根本的區別在於是否是真正獲取了一個物件的拷貝實體,而不是引用。 物

Java物件陣列拷貝

Java物件陣列深複製 1.今天做專案的時候遇到了一個java陣列深拷貝的問題,當時直接使用了Object物件的clone方法,結果不管用。 ArrayList<Cell> cells = ArrayList<Cell>(); A

JavaScript 複製陣列和複製物件 以及對 拷貝探討

前言 1. 引入 深度拷貝,大部分情況出在處理物件的情況中。 例如 因為直接賦值,是指標傳遞,這樣的話,使得兩個物件變數是相繫結的,修改其中一個,另外一個也跟著修改,大部分情況,我們只需要obj物件的值,而不需要傳遞obj物件給obj2,使得ob

JavaScript - 遍歷物件陣列(for-in迴圈)

for-in迴圈: for (佔位符 in 物件 ) { 物件 [ 佔位符 ] }  //執行中,佔位符會被物件屬性或陣列元素代替,資料傳輸必須作用 [ ],不要用 . 操作符 1.建立物件,遍歷物件      

JavaScript物件陣列(2)

Date(日期)物件和Array(陣列)物件 1. Date物件 (1) 建立Date物件 var theDate1=new Date(); (2) 部分方法如下: getDate():返回一個整數,表示當前日期是月份中的第幾天. getDay():返回

JavaScript物件陣列(1)

物件與陣列 1.屬性和方法 屬性是與物件相關的值,方法是能夠在物件上執行的操作. 字串物件擁有內建的屬性length. var txt="Hello"; txt.length=5; 在面向物件的語言中,屬性和方法常被稱為物件的成員. 1.1 訪問物件的屬性 訪問物件

遍歷物件陣列(for-in迴圈)

for-in迴圈: for (佔位符 in 物件 ) { 物件 [ 佔位符 ] }  //執行中,佔位符會被物件屬性或陣列元素代替,資料傳輸必須作用 [ ],不要用 . 操作符 1.建立物件,遍歷物件        2.建立陣列,遍歷陣列       查

資料型別:物件陣列相互轉化

1、將SimpleXMLElement Object陣列轉化為普通陣列 如格式為: $data = json_decode(json_encode($response),TRUE); 結果

js中區分物件陣列常用方法

如果你只是用typeof來檢查該變數,不論是array還是object,都將返回‘object'。 1,Object.prototype.toString.call(obj) 判斷陣列 物件 Ob

es6深層次陣列拷貝

let arr = [      {        label: '1',        children: [1, 2]      }    ]let a = [{...arr[0]}]a[0].children = []console.log(arr[0].childre

json物件陣列以及轉換成js物件的方法

JSON 語法規則 JSON 語法是 JavaScript 物件表示法語法的子集。 資料在名稱/值對中資料由逗號分隔花括號儲存物件方括號儲存陣列 JSON 物件 JSON 物件在花括號中書寫: 物件可以包含多個名稱/值對: { "firstName":"John"

java拷貝陣列(拷貝)

假設陣列a,b。要把陣列a中的元素拷貝到b中,如果直接b = a的話。就會使b指向a的儲存區域,對b的修改也會引發a中元素的修改(淺拷貝)。public class ShallowCopy { public static void main(String[] args) {

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

如何拷貝一個物件陣列

一、背景 某個專案裡,存在一個物件陣列,我用 lodash 的 filter() 函式,分別生成了 A、B 兩個新的物件陣列,但我遍歷了 B 陣列,改造裡面的每一個物件,沒想到引起 A 陣列的裡物件發生了變化,引發了錯誤。 這是一個基礎的,對引用型別—

陣列物件拷貝

在實際開發中,如果遇到稍微複雜一點的邏輯,經常會遇到要複製物件或陣列的場景。而在複製之後,我們會發現改了副本,原物件或陣列的資料也相應改變了。這就是深拷貝的問題。 其原理涉及到記憶體,簡單來說,我們的淺拷貝就是新建一個變數,指向目標變數,而不佔用新的記憶體,所有一旦改變,就是直接改變的記憶體中的值,所以原來

JavaSE——序列化反序列化(拷貝使用了該技術(克隆物件(原型模式)))

在最近學習Spring原始碼系列的時候,接觸到了一個設計模式——原型模式(資料內容相同,但是是兩個完全不同的物件例項) 原理就是實現介面重寫clone方法。如果單純的呼叫super.clone方法就屬於淺拷貝,只會拷貝8大基本資料型別和String型別。而Date和物件屬性就是引用的同一個物

拷貝陣列物件

function deepClone(obj){ let objClone = Array.isArray(obj)?[]:{}; if(obj && typeof obj==="object"){ for(var key in

Java 陣列拷貝拷貝

http://www.cppblog.com/baby-fly/archive/2010/11/16/133763.html 定義一個數組int[] a={3,1,4,2,5}; int[] b=a;  陣列b只是對陣列a的又一個引用,即淺拷貝。如果改變陣列b中元素的值

js中物件陣列拷貝

通常我們對陣列、物件、物件陣列進行簡單賦值運算只是建立了一份原內容的引用,指向的仍然是同一塊記憶體區域,修改時會對應修改原內容,而有時候我們並不需要這種模式,這就需要對內容進行深拷貝。 一、陣列的深拷貝 方法1:遍歷複製 var arr = ["a", "b"], arrCopy = [

js中值的基本型別引用型別,以及物件引用,物件的淺拷貝拷貝

js有兩種型別的值:棧:原始資料型別(undefinen,null,boolead,number,string)堆:引用資料型別(物件,函式和陣列)兩種型別的區別是:儲存位置不同,原始資料型別直接儲存在棧(stack)中的簡單資料段,佔據空間小,大小固定,屬於被頻繁使用的資料,所以放入棧中儲存;引用資料型別儲