拷贝
来源:互联网 发布:手机蟑螂软件 编辑:程序博客网 时间:2024/05/29 12:54
数组的浅拷贝
var array=[1,3,5];var array_new=array;console.log(array_new);//[1,3,5]array_new[0]=7;console.log(array);//[7,3,5]
浅拷贝更改其中一个,其他都会随之改变,可以理解为知识复制了一个指针给新的数组;
数组的深拷贝
方法①:.slice(a,b)方法,复制大于等于a,小于b的数组项目
arrayObject.slice(start,end),返回一个新的数组。
start必需。规定从何处开始选取。如果是负数,那么它规定从数组尾部开始算起的位置。也就是说,-1 指最后一个元素,-2 指倒数第二个元素,以此类推。如果 end 未被规定,那么 slice() 方法会选取从 start 到数组结尾的所有元素。
var array=[1,3,5];var array_new=array.slice(0,2);console.log(array_new);//[1,3]array_new[0]=7;console.log(array);//[1,3,5]
方法②:a.concat(b),该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本。将b连接到a后面,返回一个新的数组。
var array=[1,3,5];var array_new=array.concat();console.log(array_new);//[1,3,5]array_new[0]=7;console.log(array);//[1,3,5]
对象的浅拷
对象的浅拷贝,与数组的浅拷贝相同
var obj={ name:"zh", age:23};var obj_new=obj;console.log(obj_new);//{name: "zh", age: 23}obj_new.name="joe";console.log(obj);//{name: "zh", age: 23}
对象的另一种浅拷贝:把对象的属性遍历一遍,赋给一个新的对象。
如果一个对象中的所有属性值都是简单的值类型,要复制它很简单
ob
function easyCopy(obj){ var new_obj={}; for(var i in obj){ new_obj[i]=obj[i]; } return new_obj;}var obj={ name:"zh", age:23};var obj_new=easyCopy(obj);console.log(obj_new)//{name: "zh", age: 23}
但是,这样的拷贝有一个问题。那就是,如果父对象的属性等于数组或另一个对象,那么实际上,子对象获得的只是一个内存地址,而不是真正拷贝,因此存在父对象被篡改的可能。这样只是拷贝了基本类型的数据,也属于浅拷贝。
对象的深拷贝
所谓”深拷贝”,就是能够实现真正意义上的数组和对象的拷贝。它的实现并不难,只要递归调用”浅拷贝”就行了。
function deepCopy(p, c) { var c = c || {}; for (var i in p) { if (typeof p[i] === 'object') { c[i] = (p[i].constructor === Array) ? [] : {}; deepCopy(p[i], c[i]); } else { c[i] = p[i]; } } return c; }
当对象中不包含方法时,可以使用JSON对象的方法进行复制
var obj={ name:"zh", age:[1,2,3]};var obj_new=JSON.parse(JSON.stringify(obj));console.log(obj_new);//{name: "zh", age: 23}obj_new.name="sb";console.log(obj_new);//{name: "sb", age: 23}console.log(obj);//{name: "zh", age: 23}
parse用于从一个字符串中解析出json对象,stringify()用于从一个对象解析出字符串
使用jQuery的extend方法
jQuery.extend( [deep], target, object1 [, objectN ] )
在默认情况下,通过$.extend()合并操作不是递归的(浅拷贝);如果第一个对象的属性本身是一个对象或数组,那么它将完全用第二个对象相同的key重写一个属性。这些值不会被合并。然而,如果将 true 作为该函数的第一个参数,那么会在对象上进行递归的合并(深拷贝)。
浅拷贝(false 默认):如果第二个参数对象有的属性第一个参数对象也有,那么不会进行相同参数内部的比较,直接将第一个对象的相同参数覆盖。
深拷贝(true):如果第二个参数对象有的属性第一个参数对象也有,还要继续在这个相同的参数向下一层找,比较相同参数的对象中是否还有不一样的属性,如果有,将其继承到第一个对象,如果没有,则覆盖。
浅复制
var obj={ name:"zh", age:[1,2,3]};var obj_new={};$.extend(obj_new,obj);console.log(obj_new);obj_new.age[0]="sb";console.log(obj.age[0]);//sb
深复制
“`
var obj={
name:”zh”,
age:[1,2,3]
};
var obj_new={};
$.extend(true,obj_new,obj);
console.log(obj_new);
obj_new.age[0]=”sb”;
console.log(obj.age[0]);//1
- 拷贝
- 拷贝
- 拷贝
- 拷贝
- 拷贝
- 拷贝
- 拷贝
- 拷贝表(拷贝数据)
- 深拷贝&&浅拷贝
- 深拷贝||浅拷贝
- 浅拷贝,深拷贝
- 浅拷贝,深拷贝
- 深拷贝,浅拷贝
- 浅拷贝 深拷贝
- 浅拷贝.深拷贝
- 浅拷贝 深拷贝
- 深拷贝,浅拷贝
- 深拷贝、浅拷贝
- Android开发之自定义圆形的ImageView的实现
- 题目1177:查找
- 手机CNN网络模型--MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications
- 电子邮件相关_邮件传输协议简单了解
- 日常杂七杂八的学习笔记
- 拷贝
- 文件编码问题
- 基于协程的Python网络库gevent介绍
- centos7.0之vsftpd随笔
- IntelliJ IDEA如何导入Gradle项目
- 【精】Retrofit2 完全解析 探索与okhttp之间的关系
- MySQL 引擎效率设计心得
- Hadoop 2.7.2 开发环境配置(Mac 10.11.5)
- js函数理解