JS 对象引用和深拷贝

1 var a = XX;
2 var b = a;

如果a是基本类型,则为值拷贝;如果a是对象,则是引用拷贝。

1.深拷贝

 1 function deepCopy(obj) {
 2             if (typeof obj != ‘object‘)
 3                 return obj;
 4
 5             var newObj = {};
 6             for (var attr in obj) {
 7                 newObj[attr] = deepCopy(obj[attr]);
 8             }
 9             return newObj;
10         }
时间: 2024-08-07 20:55:00

JS 对象引用和深拷贝的相关文章

深度克隆---js对象引用

首先,我们要知道,javascript中除了基本类型(number,string,boolean,null,undefined)之外就是引用类型了,也可以说就是js对象了. 引用类型的赋值其实是对象保存在栈区地址指针的赋值,因此两个变量指向同一个对象,任何的操作都会相互影响. 在探讨到深度克隆之前,我们先来看一下下面的例子: example01: 1 var a = [1,2,3]; 2 var b = a; // a b共用一个引用 3 b.push(4); 4 alert(b); // [1

js中的深拷贝和浅拷贝

深复制和浅复制只针对像 Object, Array 这样的复杂对象的.简单来说,浅复制只复制一层对象的属性,而深复制则递归复制了所有层级. 深浅拷贝 的主要区别就是:复制的是引用(地址)还是复制的是实例. 所谓 深浅拷贝: 对于仅仅是复制了引用(地址),换句话说,复制了之后,原来的变量和新的变量指向同一个东西,彼此之间的操作会互相影响,为 浅拷贝. 而如果是在堆中重新分配内存,拥有不同的地址,但是值是一样的,复制后的对象与原来的对象是完全隔离,互不影响,为 深拷贝. 下面是一个简单的浅复制实现:

js 中的深拷贝和浅拷贝

 Shallow copy && Deep copy 对于字符串类型,浅复制是对值的复制,对于对象来说,浅复制是对对象地址的复制,并没 有开辟新的栈,也就是复制的结果是两个对象指向同一个地址,修改其中一个对象的属性,则另一个对象的属性也会改变, 举个栗子 var arr = [1,2,3]; var arrCopy = arr; arrCopy[0] = 100; // 修改新数组的第0个值: arr[0]===arrCopy[0]; //true 原来的数组四不四也变了 而很多数情况下我

js 中的 深拷贝与浅拷贝

js在平时的项目中,赋值操作是最多的:比如说: 1 var person1 = { 2 name:"张三", 3 age:18, 4 sex:"male", 5 height:180, 6 weight:14012 } 13 var person2 = person1; 14 console.log(person2) 15 person2.name = "李四"; 16 console.log(person1,person2); 这段代码,con

JS对象引用

对象和函数都是引用的关系(改变后者会改变前者) 但是下面这个列子情况不一样了.刚开始的时候 B 引用了 A的地址,后来B又重新赋值,新占了一个地址,A   B俩的关系已经脱离. 那么有的时候,我们只有复制一个对象,而修改这个新对象的时候不希望影响原来的对象.如下:(浅拷贝,只能拷贝一层,深层次的对象还是引用关系) 递归: 1. 函数调用函数自身,执行递的动作. 2.最后一次判断一个终止条件,可以执行归的动作. 深拷贝:

js对象引用传递

今天写接口测试demo,发现js值引用问题 js 普通变量为值传递 js 对象为为引用传递 var a = 123; undefined var b=a; undefined a 123 b 123 b =234 234 a 123 a = 456 456 b 234 var o = {name:'lxb',age:21} undefined h = o Object { name: "lxb", age: 21 } h.width = 20 20 o Object { name: &

js中的深拷贝与浅拷贝

对于字符串类型,浅拷贝是对值的拷贝,对于对象来说,浅拷贝是对对象地址的拷贝,并没有开辟新的栈,也就是拷贝的结果是两个对象指向同一个地址,修改其中一个对象的属性,则另一个对象的属性也会改变,而深拷贝则是开辟新的栈,两个对象对应两个不同的地址,修改一个对象的属性,不会改变另一个对象的属性. 深拷贝的实现方法: b = JSON.parse( JSON.stringify(a) ) 这样做的局限性: 无法复制函数 原型链没了,对象就是object,所属的类没了. 另: jquery.extend()也

浅谈js中的深拷贝和浅拷贝

1. 如果是基本数据类型(String,Number,Boolean,Null,undefined),名字和值都会储存在栈内存中.栈内存中的数据每一次赋值都会产生一个新的内存,每条数据之间不相互影响, var a = 1; b = a; // 栈内存会开辟一个新的内存空间,此时b和a都是相互独立的 b = 2; console.log(a); // 1 2. 如果是引用数据类型(Object),名字存在栈内存中,值存在堆内存中,但是栈内存会提供一个引用的地址指向堆内存中的值. 例如:var a=

js对象简单深拷贝

function deepClone(obj1,obj2){ var obj2=obj2||{}; //最初的时候给它一个初始值=它自己或者是一个json for(var name in obj1){ if(typeof obj1[name] === "object"){ //先判断一下obj[name]是不是一个对象 obj2[name]= (obj1[name].constructor===Array)?[]:{}; //我们让要复制的对象的name项=数组或者是json deep