最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

javaScript深拷貝和淺拷貝的簡單介紹

 更新時間:2022年05月06日 11:21:15   作者:程序猿布歐  
深淺拷貝知識在我們的日常開發(fā)中還算是用的比較多,下面這篇文章主要給大家介紹了關(guān)于javaScript深拷貝和淺拷貝的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下

在了解深拷貝和淺拷貝之前,我們先梳理一下:

JavaScript中,分為基本數(shù)據(jù)類型(原始值)和復(fù)雜類型(對象),同時它們各自的數(shù)據(jù)類型細分下又有好幾種數(shù)據(jù)類型

基本數(shù)據(jù)類型

數(shù)字Number 字符串String 布爾Boolean Null Undefined Symbols BigInt

基本數(shù)據(jù)類型在內(nèi)存當中,是存儲在棧Stack

在數(shù)據(jù)結(jié)構(gòu)當中

  • 棧在內(nèi)存上的分配的空間生命周期很短,當變量使用完畢,方法執(zhí)行完成就被釋放掉,因此在js當中,變量使用完畢之后,基本就被回收了,
  • 有一個場景比較例外,閉包的情況下,變量是始終存在內(nèi)存當中不被釋放.
  • 棧存儲具有先進后出,后進先出的特點: 1,2,3,4,5,6 => 6,5,4,3,2,1

引用數(shù)據(jù)類型

日期Dete,對象Object,數(shù)組Array,方法Function, 正則regex,帶鍵的集合:Maps, Sets, WeakMaps, WeakSets

引用數(shù)據(jù)類型與堆內(nèi)存heap的一些關(guān)系

  • 在JavaScript中,不允許直接訪問堆內(nèi)存中的位置,不能直接操作對象的堆內(nèi)存空間。
  • 對象的引用地址是存在棧內(nèi)存中,在我們的日常編碼過程中,操作對象的時候,讀取對象的存在棧內(nèi)存的引用地址而不是在堆中的對象,引用類型的值都是通過引用訪問。

JavaScript中堆內(nèi)存和棧內(nèi)存簡易示意圖例

下面對于對象的操作,都可以參照上圖進行思考

淺拷貝-深拷貝

淺拷貝

只是拷貝了某一層的屬性,或者某一層,沒有全部拷貝到另外的對象上

let userInfo = {
  name: "zhangsan",
  age: "29",
  say: function () {
    console.log("hello");
  },
  child: [
    {
      name: "zhangsan01",
    },
  ],
};

對象解構(gòu),只能拷貝第一層對象

// 對象解構(gòu)...
let info = { ...userInfo };
info.name = "lisi";
info.child.name = "lisi001";
info.say();

console.log("userInfo", userInfo);
console.log("info", info);

userInfo和info中的child.name都改成了---->"lisi001"

Object.assign() 第一層是深拷貝,二級屬性后就是淺拷貝

let info = {};
Object.assign(info, userInfo);
info.name = "lisi";
info.child.name = "lisi001";
console.log("userInfo", userInfo);
console.log("info", info);

JSON.parse(JSON.stringify());

對象可以復(fù)制,但是當屬性是function時,沒有復(fù)制到新的對象上,因此在日常的開發(fā)過程中,涉及到數(shù)組對象,使用JSON.parse(JSON.stringify());還是沒問題的

let info = JSON.parse(JSON.stringify(userInfo));
info.name = "lisi";
info.child.name = "lisi001";
console.log("userInfo", userInfo);
console.log("info", info);

for in,第一層可以拷貝,第二層在修改的時候,還是使用的引用地址,前后的對象都發(fā)生了更改

let info = {};
for (let key in userInfo) {
  info[key] = userInfo[key];
}
info.name = "lisi";
info.child.name = "lisi001";
console.log("userInfo", userInfo);
console.log("info", info);

淺拷貝小結(jié)

以上淺拷貝方法,有些拷貝只能拷貝第一層,有些可以拷貝多層,

但是當屬性類型是方法時,還是淺拷貝,

因此我們在開發(fā)中,使用淺拷貝,需要注意,同時,出了拷貝function,類似正則,date等數(shù)據(jù)類型沒有一一列舉,感興趣的同學(xué)可以自己寫一些demo,去校驗更為復(fù)雜和數(shù)據(jù)類型更豐富的數(shù)據(jù)。

深拷貝

所有的屬性都拷貝到新的對象上

使用遞歸遍歷每一個屬性,在遞歸遍歷的時候,針對每一種數(shù)據(jù)類型處理和拷貝

lodash深拷貝方法,感興趣的同學(xué),可以去閱讀lodash深拷貝的實現(xiàn)源碼

文檔地址:深拷貝cloneDeep https://www.lodashjs.com/docs/lodash.cloneDeep

更多方法,有待補充

結(jié)尾

當我們操作復(fù)雜數(shù)據(jù)類型的時候,都是在操作棧內(nèi)存Stack的內(nèi)存地址,指針指向?qū)ο笤诙褍?nèi)存heap的數(shù)據(jù)。

傳入的對象是使用對象字面量{}創(chuàng)建的對象還是由構(gòu)造函數(shù)生成的對象

如果對象是由構(gòu)造函數(shù)創(chuàng)建出來的,那么是否要拷貝原型鏈上的屬性

如果要拷貝原型鏈上的屬性,那么如果原型鏈上存在多個同名的屬性,保留哪個

針對的數(shù)據(jù)類型,屬性的數(shù)據(jù)類型,各自的缺陷,適用的業(yè)務(wù)場景,自己造輪子or使用原生方法,工具類

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

源碼地址

碼云 https://gitee.com/lewyon/vue-note

githup https://github.com/akari16/vue-note

相關(guān)文章

最新評論

抚宁县| 尚志市| 临江市| 怀集县| 金沙县| 大竹县| 南投市| 永川市| 青田县| 内黄县| 万州区| 库尔勒市| 邹城市| 鄯善县| 昌黎县| 南部县| 武汉市| 洪湖市| 杨浦区| 铁岭县| 滦平县| 台江县| 北流市| 西丰县| 灵宝市| 巴林左旗| 威海市| 峨边| 芜湖市| 奎屯市| 乐安县| 新宁县| 凤山市| 虎林市| 西林县| 页游| 泗洪县| 盐边县| 定边县| 潼南县| 隆昌县|