JS的深度克隆,利用构造函数原型深度克隆

我爱撸码,撸码使我感到快乐!
大家好,我是Counter。
今天来写写,JS中的深度克隆,这个在笔面试中,考的还是比较多的,主要是对象与数组的赋值,如果直接赋值的话,那么得到的是对象或者数组在堆里的地址,那么原有的的数据修改的话,那么克隆的数据也会随着修改,这就是浅克隆,所以这边就要使用到枚举,然后再每一项赋值,这样就可以完成一份深度克隆,这样原对象里修改属性,如果你在这对象修改之前已经克隆的话,那么你这个克隆的对象,对象里的属性是不变,这就是深度克隆。
话不多说了,直接上代码:

// 假设要克隆的对象a
        var a = {
            a: 1,
            b: 2,
            c: {
                d: 3,
                e: 4,
                f: [0, 9, 8, 7, [6, 5, 4]]
            }
        };

        // 自定义克隆函数
        function clone(obj) {
            // 判断,如果传进来的参数是数组的话
            if ( obj instanceof Array) {
                // 定义一个空数组
                var arr = [];
                // 遍历整个数组
                for( var i = 0; i < obj.length; i++) {
                    // 深度克隆数组每一项
                    arr[i] = clone(obj[i]);
                }
                // 再返回出去
                return arr;
            }
            // 判断是否为对象
            if ( obj instanceof Object) {
                // 构建一个空对象
                var obj1 = {};
                // 枚举传进来的对象
                for( key in obj) {
                    // 深度克隆对象
                    obj1[key] = clone(obj[key]);
                }
                // 再返回出去
                return obj1;
            }
            // 如果传进的不是数组,也不是对象,那么就返回当前值
            return obj;
        }

        // 利用构造函数的原型克隆,也可以实现深度克隆
        function clone1(obj) {
            function F() {};
            F.prototype = obj;
            return new F()
        }

原文地址:https://www.cnblogs.com/Counterrr/p/10622439.html

时间: 2024-07-30 14:25:20

JS的深度克隆,利用构造函数原型深度克隆的相关文章

利用Theano理解深度学习——Multilayer Perceptron

一.多层感知机MLP 1.MLP概述 对于含有单个隐含层的多层感知机(single-hidden-layer Multi-Layer Perceptron, MLP),可以将其看成是一个特殊的Logistic回归分类器,这个特殊的Logistic回归分类器首先通过一个非线性变换Φ(non-linear transformation)对样本的输入进行非线性变换,然后将变换后的值作为Logistic回归的输入.非线性变换的目的是将输入的样本映射到一个空间,在该空间中,这些样本是线性可分的.这个中间层

js自定义类,混合的构造函数/原型方式

“混合的构造函数/原型方式” 用构造函数来定义非函数属性,用原型方式定义对象的函数属性,结果所有函数都只创建一次,而每个对象都具有自由的对象属性实例. function ocar(color){  this.color = color;  this.arr = new Array("s"); } ocar.prototype.showColor = function(){  alert(this.color); } var car = new ocar("resd"

JS面向对象(1)——构造函数模式和原型模式

1.构造函数模式 构造函数用来创建特定的类型的对象.如下所示: function Person(name,age,job){ this.name=name; this.job=job; this.age=age; this.sayName=function(){ alert(this.name); }; } var person1=new Person('nick',20,'student');var person2=new Person('nick',20,'student');alert(p

如何利用Python和深度神经网络锁定即将流失的客户?业绩过十万!

烦恼 作为一名数据分析师,你来到这家跨国银行工作已经半年了. 今天上午,老板把你叫到办公室,面色凝重. 你心里直打鼓,以为自己捅了什么篓子.幸好老板的话让你很快打消了顾虑. 客户主要分布在法国.德国和西班牙. 你手里掌握的信息,包括他们的年龄.性别.信用.办卡信息等.客户是否已流失的信息在最后一列(Exited). 请选择左侧的Python 3.6版本下载安装. 其次是新建文件夹,起名为demo-customer-churn-ann,并且从这个链接下载数据,放到该文件夹下. 点击界面右上方的Ne

MDN——javascript——入门——第三章对象——对象.构造函数.原型链.继承——知识点总结

对象Object 由属性property(变量).方法method(函数)组成 var objectName = { member1Name : member1Value, member2Name : member2Value, member3Name : member3Value } member(成员)的值是任意的, 一个如上所示的对象被称之为对象的字面量(literal)——手动的写出对象的内容来创建一个对象.不同于从类实例化一个对象,我们会在后面学习这种方式. 访问对象成员 1.点表示法

Js基础知识(二) - 原型链与继承精彩的讲解

作用域.原型链.继承与闭包详解 注意:本章讲的是在es6之前的原型链与继承.es6引入了类的概念,只是在写法上有所不同,原理是一样的. 几个面试常问的几个问题,你是否知道 instanceof的原理 如何准确判断变量的类型 如何写一个原型链继承的例子 描述new一个对象的过程 也许有些同学知道这几个问题的答案,就会觉得很小儿科,如果你还不知道这几个问题的答案或者背后所涉及到的知识点,那就好好看完下文,想必对你会有帮助.先不说答案,下面先分析一下涉及到的知识点. 什么是构造函数 JavaScrip

【深度学习系列1】 深度学习在腾讯的平台化和应用实践(转载)

转载:原文链接 [深度学习系列1] 深度学习在腾讯的平台化和应用实践 引言:深度学习是近年机器学习领域的重大突破,有着广泛的应用前景.随着Google公开 Google Brain计划,业界对深度学习的热情高涨.腾讯在深度学习领域持续投入,获得了实际落地的产出.我们准备了四篇文章,阐述深度学习的原理和在腾讯的实 践,介绍腾讯深度学习平台Mariana,本文为第一篇. 深度学习(Deep Learning)是近年来机器学习领域的热点,在语音识别.图像识别等领域均取得了突破性进展.腾讯提供广泛的互联

js类方法,对象方法,原型的理解(转)

function People(name) { this.name=name; //对象方法 this.Introduce=function(){ alert("My name is "+this.name); } } //类方法 People.Run=function(){ alert("I can run"); } //原型方法 People.prototype.IntroduceChinese=function(){ alert("我的名字是&quo

【深度学习系列4】深度学习及并行化实现概述

[深度学习系列4]深度学习及并行化实现概述 摘要: 深度学习可以完成需要高度抽象特征的人工智能任务,如语音识别.图像识别和检索.自然语言理解等.深层模型是包含多个隐藏层的人工神经网络,多层非线性结构使其具备强大的特征表达能力和对复杂任务建模能力.训练深层模型是长期以来的难题,近年来以层次化.逐层初始化为代表的一系列方法的提出给训练深层模型带来了希望,并在多个应用领域获得了成功.深层模型的并行化框架和训练加速方法是深度学习走向实用的重要基石,已有多个针对不同深度模型的开源实现,Google.Fac