前言 说到深浅拷贝,必须先提到的是JavaScript的数据类型,之前的一篇文章JavaScript基础心法——数据类型说的很清楚了,这里就不多说了。 需要知道的就是一点:JavaScript的数据类型分为基本数据类型和引用数据类型。 对于基本数据类型的拷贝,并没有深浅拷贝的区别,我们所说的深浅拷贝都是对于引用数据类型而言的。 浅拷贝 浅拷贝的意思就是只复制引用,而未复制真正的值。 const originArray = [1,2,3,4,5]; const originObj =...
废话不多说了,直接给大家贴代码了,具体代码如下所示: function mottoClone (obj) {if (obj === null || typeof obj !== object) return obj;if (obj instanceof Boolean) return new Boolean(obj.valueOf());if (obj instanceof Number) return new Number(obj.valueOf());if (obj instanceof String) return new String(obj.valueOf());if (obj instanceof RegExp) return new RegExp(obj.valueOf());if (obj instanceof Date) ...
本文实例讲述了javascript深拷贝的原理与实现方法。分享给大家供大家参考,具体如下: 要讲JavaScript的拷贝,就得先讲讲javascript中的值传递和引用传递。 javascript中没有一个具体的语法来规定哪些参数是引用传递,而其他语言中都有明文规定,比如 C# 中的 ref 和 PHP 中的 & 。这也是javascript众多弊端中的一个。 我们先看看下面这段代码: //值传递 var i = 3; var j = i; j = 4; document.write(i);//3 //引用传递 var m = ...
jQuery的$.extend 浅拷贝与深拷贝 $.extend( [deep ], target, object1 [, objectN ] );deep 类型: Boolean 如果是true,合并成为递归(又叫做深拷贝)。target 类型: Object 对象扩展。这将接收新的属性。object1 类型: Object 一个对象,它包含额外的属性合并到第一个参数。 objectN 类型: Object 包含额外的属性合并到第一个参数。 $.extend浅拷贝: var obj1 = {name:xx,age:18,sex:man}; var obj2 = {name:cc,age:18...
1、javaScript的变量类型 (1)基本类型:5种基本数据类型Undefined、Null、Boolean、Number 和 String,变量是直接按值存放的,存放在栈内存中的简单数据段,可以直接访问。(2)引用类型:存放在堆内存中的对象,变量保存的是一个指针,这个指针指向另一个位置。当需要访问引用类型(如对象,数组等)的值时,首先从栈中获得该对象的地址指针,然后再从堆内存中取得所需的数据。 JavaScript存储对象都是存地址的,所以浅拷贝会导...
一、数组的深浅拷贝 在使用JavaScript对数组进行操作的时候,我们经常需要将数组进行备份,事实证明如果只是简单的将它赋予其他变量,那么我们只要更改其中的任何一个,然后其他的也会跟着改变,这就导致了问题的发生。 这是为什么呢? 因为如果只是简单的赋值,它只是进行了地址的引用,所以改变一个另一个也会跟着变。 var arr = ["One","Two","Three"]; var arrto = arr; arrto[1] = "test"; document.writeln("数组的原始值:"...
对象的深拷贝与浅拷贝的区别如下: 浅拷贝:仅仅复制对象的引用,而不是对象本身; 深拷贝:把复制的对象所引用的全部对象都复制一遍。 一. 浅拷贝的实现 浅拷贝的实现方法比较简单,只要使用是简单的复制语句即可。 1.1 方法一:简单的复制语句 /* ================ 浅拷贝 ================ */ function simpleClone(initalObj) { var obj = {}; for ( var i in initalObj) { obj[i] = initalObj[i]; } ...
例如这个例子: 代码如下:var arr = ["One","Two","Three"];var arrto = arr;arrto[1] = "test";document.writeln("数组的原始值:" + arr + "<br />");//Export:数组的原始值:One,test,Threedocument.writeln("数组的新值:" + arrto + "<br />");//Export:数组的新值:One,test,Three 像上面的这种直接赋值的方式就是浅拷贝,很多时候,这样并不是我们想要得到的结果,其实我们想要的是arr的值不变,不是吗? 方法一:js的slice...
我们先看一下浅复制的缺陷,不知多少人中过招呢? 代码如下:var oOriginal = { memNum: 1, // number memStr: "I am a string", // string memObj: { test1: "Old value" // well test }, memArr: [ // array "a string", // string member of array { // object member of array test2: "Try changing me" // well test } ] }; 这是一个比较复杂的对象,对象包含着对象与数组。我们用Prototype著名的继承函数复杂一下。它那个东...
function objectClone(obj,preventName){ if((typeof obj)=='object'){ var res=(!obj.sort)?{}:[]; for(var i in obj){ if(i!=preventName) res[i]=objectClone(obj[i],preventName); } return res; }else if((typeof obj)=='function'){ return (new obj()).constructor; } return obj; }
什么是"clone"? 在实际编程过程中,我们常常要遇到这种情况:有一个对象A,在某一时刻A中已经包含了一些有效值,此时可能会需要一个和A完全相同新对象B,并且此后对B任何改动都不会影响到A中的值,也就是说,A与B是两个独立的对象,但B的初始值是由A对象确定的。在Java/javasript语言中,用简单的赋值语句是不能满足这种需求的。要满足这种需求虽然有很多途径,但实现clone()方法是其中最简单,也是最高效的手段,当然了 javascrip...
今天来给大家说一下JS的js深拷贝和浅拷贝,它们有什么区别,有什么作用呢?下面给大家举例说明一下。var m = { a: 10, b: 20 }var n = m;n.a = 15;// 这时m.a的值是多少m.a会输出15,因为这是浅拷贝,n和m指向的是同一个堆,对象复制只是复制的对象的引用。深拷贝深拷贝和上面浅拷贝不同,就是彻底copy一个对象,而不是copy对象的引用,例如,还是之前的例子,我们这么写:var m = { a: 10, b: 20 }var n = {a:m.a,b:m.b};n.a = 15...
基本数据类型,拷贝是直接拷贝变量的值,而引用类型拷贝的其实是变量的地址。而浅拷贝和深拷贝就是在这个基础之上做的区分,如果在拷贝这个对象的时候,只对基本数据类型进行了拷贝,而对引用数据类型只是进行了引用的传递,而没有重新创建一个新的对象,则认为是浅拷贝;反之,在对引用数据类型进行拷贝的时候,创建了一个新的对象,并且复制其内的成员变量,则认为是深拷贝。深拷贝实例代码:let o2 = JSON.parse(JSON.stringify...
如何区分深拷贝与浅拷贝,简单点来说,就是假设B复制了A,当修改A时,看B是否会发生变化,如果B也跟着变了,说明这是浅拷贝,拿人手短,如果B没变,那就是深拷贝,自食其力。 所谓深浅拷贝,都是进行复制,那么区别主要在于复制出来的新对象和原来的对象是否会互相影响,改一个,另一个也会变 浅拷贝(Shallow Copy) VS 深拷贝(Deep Copy) 一、如何实现深拷贝 1 递归function deepClone(source){ if(!source && typeof sour...
为了实现一个函数clone,可以对JavaScript中5种主要的数据类型 (包括Number、String、Object、Array、Boolean)进行值(深)复制。/***复制一份数据*@paramobj*return复制结果***/function clone(obj){var buf;if(obj instanceof Array){var i=obj.length;buf=[];//向空的数组中复制内容while(i--){buf[i]=clone(obj[i])}return buf;}else if(obj instanceof Object){buf={};//向空的对象中复制内容for(var i in obj){buf[i]=clon...