Js中的引用類型、深拷貝、淺拷貝

問題:

最近工做中遇到一個問題,對現目錄進行正序、倒序展現的操做,但真正的數據順序不發生變化。
複製代碼

首先,一塊兒瞭解下Js的數據類型都有哪些?它們有哪些區別?

  • 基本類型:Number,String,Boolean,Null,undefined
  • 引用類型:Object,Array,Date,RegExp,Function

基本類型的變量是存儲在棧內存中的,棧內存包括變量名和變量值;es6

引用類型的值同時存儲在棧內存和堆內存中,棧內存中保存的是變量名和指向堆內存中對象的指針。形成這樣的緣由是因爲在Js中不容許直接操做對象的內存空間,只能操做對這個對象的引用;數組

基本類型的比較是值的比較,引用類型的比較是引用的比較函數

基本類型:spa

eg: let str1="ceshi";
let str2=str1;指針

由此可知: 基本類型的複製,其實是在棧內存中開闢了新的存儲空間,來存儲新的變量和值。一個的改變,不會影響另外一個的變化,兩者互不干擾。code

引用類型:cdn

eg: let obj1=new Object(); let obj2=new Object();對象

由此可知: 引用類型的複製,實際上只是對引用的複製,二者的指針同時指向堆內存中的同一個對象。一個的改變,會影響另外一個的變化,二者互相影響。blog

深拷貝與淺拷貝

淺拷貝:就是拷貝一層,面對深層次的對象級別,就僅僅拷貝了其引用。 深拷貝:就是拷貝多層,即對每一層的數據都進行了拷貝,面對深層次對象級別,防止拷貝了其引用類型遞歸

淺拷貝:

方法一:拷貝對象有多層,直接遍歷,則是淺拷貝

方法二:使用es6的Object.assign({},原對象);提示:(拷貝的對象有多層,此方法實現的是淺拷貝;拷貝的對象只有一層,此方法實現的是深拷貝)

深拷貝:

數組深拷貝:即防止拷貝到引用類型,防止彼此影響

方法一:es6 Array.from(要拷貝的數據)

方法二:es6 數組解構 ...

方法三:若拷貝的對象爲一層,直接遍歷,爲深拷貝 方法四:使用JSON.stringify()、JSON.parse(),不足:若深層是函數,則實現不了深拷貝

方法五:使用遞歸思想

說到這裏算是大體結束。我最後在項目中的解決方案:

因爲個人目錄數據是一層的,因此使用es6的方法,進行了深拷貝。這樣當目錄數據倒序時,我獲取的接口數據並無發生順序的變化

相關文章
相關標籤/搜索