下面小编就为大家带来一篇浅谈JavaScript中面向对象的的深拷贝和浅拷贝。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。1.浅拷贝:复制一份引用,所有引用对象都指向一份数据,并且都可以修改这份数据。2.深拷贝(复杂):复制变量值,对于非基本类型的变量,则递归至基本类型变量后,再复制。这里画一个简单的图来加深理解:一、数组的深浅拷贝在使用JavaScript对数组进行操作的时候,我们经常需要将数组进行备份,事实证明...
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...
我们先看一下浅复制的缺陷,不知多少人中过招呢? 代码如下: 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著名的继承函数复杂一下。它那个东...
例如这个例子: 代码如下:var arr = ["One","Two","Three"];var arrto = arr;arrto[1] = "test";document.writeln("数组的原始值:" + arr + "");//Export:数组的原始值:One,test,Threedocument.writeln("数组的新值:" + arrto + "");//Export:数组的新值:One,test,Three 像上面的这种直接赋值的方式就是浅拷贝,很多时候,这样并不是我们想要得到的结果,其实我们想要的是arr的值不变,不是吗? 方法一:js的slice函数 代码如下...
(一)JS中基本类型和引用类型 JavaScript的变量中包含两种类型的值:基本类型值 和 引用类型值,在内存中的表现形式在于:前者是存储在栈中的一些简单的数据段,后者则是保存在堆内存中的一个对象。 基本类型值在JavaScript中基本数据类型有 String , Number , Undefined , Null , Boolean ,在ES6中,又定义了一种新的基本数据类型 Symbol ,所以一共有6种。 基本类型是按值访问的,从一个变量复制基本类型的值到另一个变量后...
本文实例讲述了JS实现数组深拷贝的方法。分享给大家供大家参考,具体如下: 最近在网上看到一篇关于js数组复制最有效的方法是直接使用slice和concat方法。这2个方法的确是最快的把数组成功复制,而不是引用。可以运行实例: <script type="text/javascript"> <!--var arr1=["1","2","3"],arr2;arr2=arr1.slice(0);arr1[0]=0; //改变arr1第一个元素alert("arr2[0]:"+arr2[0]); //不影响arr2var arr3=["1","2","3"],arr4;arr4=arr3....
本文实例讲述了jQuery使用$.extend(true,object1, object2);实现深拷贝对象的方法。分享给大家供大家参考,具体如下: 语法:jQuery.extend( [deep ], target, object1 [, objectN ] ) 深浅拷贝对应的参数就是[deep],是可选的,为true或false。默认情况是false(浅拷贝),并且false是不能够显示的写出来的。如果想写,只能写true(深拷贝) 测试例子: var object1 = {}; var object2 = {b:{mm:333},c:100 }; console.log(原来的...
本文实例讲述了JavaScript基于遍历操作实现对象深拷贝功能。分享给大家供大家参考,具体如下: function getType(o){var _t;return ((_t = typeof(o)) == "object" ? o==null && "null" || Object.prototype.toString.call(o).slice(8,-1):_t).toLowerCase(); } function extend(destination,source){for(var p in source){if(getType(source[p])=="array"||getType(source[p])=="object"){destination[p]=getType(source[p])=="ar...
本文实例讲述了JS浅拷贝和深拷贝原理与实现方法。分享给大家供大家参考,具体如下: 浅拷贝只会拷贝一层,深层的引用类型改变还是会受到影响。 深拷贝是所有内部的属性还有值都被拷贝了一份,不管深层的引用类型怎么改都不会受到影响。 浅拷贝的实现方式 1、自定义函数 function shallowClone (initalObj) {var obj = {};for ( var i in initalObj) {obj[i] = initalObj[i];}return obj; }2、ES6 的 Object.assign() let newObj = ...
一.前言 我们知道,在JS中数据类型按照访问方式和存储方式的不同可分为基本类型和引用类型。 基本类型 基本类型有String、Boolean、Number,Undefined、Null,这些基本类型都是按值传递的,也称为值类型。 引用类型 引用类型有对象、数组、函数,它们都是按引用访问的。 二.存储方式区别 基本类型和引用类型由于两者在内存中存储的方式不同,造成两者访问的方式也不同。其中,基本类型存储在内存的栈中,是按值访问;引用类型存储在...
本文实例讲述了JavaScript对象的浅拷贝和深拷贝。分享给大家供大家参考,具体如下: 1、浅拷贝 仅仅复制对象的引用,而不是对象本身。 var person = {name: Alice,friends: [Bruce, Cindy] } var student = {id: 30 } student = simpleClone(person, student); student.friends.push(David); alert(person.friends); function simpleClone(oldObj, newObj) {var newObj = newObj || {};for (var i in oldObj)newObj[i] = oldObj[i]...
本文实例讲述了JavaScript实现浅拷贝与深拷贝的方法。分享给大家供大家参考,具体如下: 平时使用数组复制时,我们大多数会使用‘=,这只是浅拷贝,存在很多问题。比如 let arr = [1,2,3,4,5]; let arr2 = arr; console.log(arr) //[1, 2, 3, 4, 5] console.log(arr2) //[1, 2, 3, 4, 5] arr[0] = 6; console.log(arr) //[6, 2, 3, 4, 5] console.log(arr2) //[6, 2, 3, 4, 5] arr2[4] = 7; console.log(arr) //[6, 2, 3, 4, 7] co...
本文实例讲述了JavaScript深拷贝和浅拷贝概念与用法。分享给大家供大家参考,具体如下: js中的浅拷贝和深拷贝,只是针对复杂数据类型(Objcet,Array)的复制问题。简单来讲浅拷贝和深拷贝都可以实现在原有对象的基础上再生成一份的作用。但是根据新生成的对象能否影响到原对象可以分为浅拷贝和深拷贝。 概念1:浅拷贝 浅拷贝就是指拷贝引用,新生成的引用和原来的引用都是指向同一个对象的实例,彼此之间的操作会相互影响。 概念2:...
一、为什么有深拷贝和浅拷贝?这个要从js中的数据类型说起,js中数据类型分为基本数据类型和引用数据类型。基本类型值指的是那些保存在栈内存中的简单数据段,即这种值是完全保存在内存中的一个位置。包含Number,String,Boolean,Null,Undefined ,Symbol。 引用类型值指的是那些保存在堆内存中的对象,所以引用类型的值保存的是一个指针,这个指针指向存储在堆中的一个对象。除了上面的 6 种基本数据类型外,剩下的就是引用类型...