MarginLon MarginLon
首页
  • Web

    • Web基础
    • Web布局
    • CodeSnippet
  • Vue

    • Vue
  • React

    • React
  • Node.js

    • Node.js
  • 技术文档
  • UI组件库
  • 动画库
  • 图形库
  • 桌面端
  • 学习笔记
  • 生活笔记
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

MarginLon

http://info.cern.ch
首页
  • Web

    • Web基础
    • Web布局
    • CodeSnippet
  • Vue

    • Vue
  • React

    • React
  • Node.js

    • Node.js
  • 技术文档
  • UI组件库
  • 动画库
  • 图形库
  • 桌面端
  • 学习笔记
  • 生活笔记
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 数据类型 类型检测 类型转换
  • 精度问题
  • 堆栈内存 函数底层运行机制 块级作用域
  • GC机制 闭包作用域 let/const/var
  • 闭包应用
  • DOM
  • BOM
  • This指向
  • 浏览器渲染机制 CRP优化 事件循环机制
  • 函数防抖节流
  • 模块化 柯里化
  • 构造函数 原型
  • CLASS
  • 工厂设计模式 深浅拷贝 深浅合并
    • 1.工厂设计模式
    • 2.数组和对象的深浅拷贝
    • 3.深比较浅比较合并
  • Iterator/Generator
  • Promise/ Async/ Await
  • HTTP/跨域
  • API
  • AJAX
  • 事件
  • 《JavaScript高级程序设计(第4版)》
MarginLon
2022-04-27
目录

工厂设计模式 深浅拷贝 深浅合并

  • 1.工厂设计模式
  • 2.数组和对象的深浅拷贝
  • 3.深比较浅比较合并

# 1.工厂设计模式

    var jQuery = function( selector, context ) {
        return new jQuery.fn.init( selector, context );
    };
    jQuery.fn = jQuery.prototype = {
        jquery: "3.6.0",
        constructor: jQuery
    };
    init = jQuery.fn.init = function( selector, context, root ){};
    init.prototype = jQuery.fn;
1
2
3
4
5
6
7
8
9

工厂设计模式


# 2.数组和对象的深浅拷贝

深浅拷贝


//======================浅克隆:只克隆第一级信息,第二级及以后的信息共用
    let obj1 = {
        name:"Margin",
        course: {
            c1:'CSS',
            c2:'JS'
        }
        fn: function(){
            console.log(this.name);
        }
    };
    // 克隆1:循环遍历 【浅】
    let obj2 ={},
        keys = [
            ...Object.keys(obj1),
            ...Object.getOwnPropertySymbols(obj1)
        ];
    keys.forEach(key =>{
            obj2[key] = obj1[key];
        });
    // 克隆2:展开运算符 【浅】
    let obj2 = {
            ...obj1
        };
    // 克隆3:assign 【浅】
    // 原理 Object.assign([obj1],[obj2]); 
    // => 返回结果仍是obj1堆内存,只不过是把obj2中的键值对和obj1的键值对合在一起
    let obj = Object.assign({},obj1);
//======================数组浅拷贝 
    let arr = [10, 20, [30,40]];

    // 克隆1:循环 for each [浅]
    let arr2 = []; 
    arr1.forEach((item, index) => {
        arr2[index] = item;
    });

    arr2 = arr1.map(item => item);

    // 克隆2:展开运算符 Object.assign 【浅】

    // 克隆3:基于slice/concat 【浅】
    let arr2 = arr1.slice();

//======================深克隆:每一级信息都克隆
    // 克隆1:JSON.stringfy / JSON.parse

    // 原理:基于JSON.stringfy把原对象(数组)变为字符串,再基于JSON.parse把字符串转化为对象或者数组。
    // 问题: 1.正则,Math,ArrayBuffer对象 => 空对象; 
    //      2.函数/Symbol/undefined属性值的属性 => 消失;  
    //      3. BigInt => 不能处理; 
    //      4. Date => String 
    //      5. arrayBuffer等也存在问题
    let obj2 = JSON.parse(JSON.stringfy(obj1));
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55

# 3.深比较浅比较合并

编辑 (opens new window)
上次更新: 2023/04/01, 15:26:22
CLASS
Iterator/Generator

← CLASS Iterator/Generator→

最近更新
01
KnockoutJS
11-12
02
综述
10-17
03
前言
10-12
更多文章>
Theme by Vdoing | Copyright © 2019-2024 MarginLon | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式