在js中,变量所存的值分为了原始类型和引用类型,其中Number,String是原始值,其他是引用值。
原始类型的值在传递过程中是按值传递,而引用类型传递的则是指针,即传递的仅仅只是引用关系,并非真正的值,若内存中的真实值被修改,则所有引用此值的变量都会被更新。
在复制对象的过程中,如果仅复制了引用指针,则称为浅复制;复制了真实值,则称为深复制。
浅拷贝:
浅拷贝一般都是直接将对象赋值给新变量就完事儿了,对于原始值来说,副本和正本从此没啥关系了。而对于引用类型,像数组和对象之类的值,副本和正本拿到的是同一个数据,数据更新后,正本和副本都会更新。
var obj = { name :‘zhouxiaohouer‘, age:24, assets:{ cash:1234, stock:22222 }, say:function() { console.log(this.name) } } var objb = obj obj.name = ‘fixed‘ console.log(obj.name)//fixed console.log(objb.name)//fixed
深拷贝:
深拷贝本质上是递归实现浅拷贝,深拷贝之后,副本和正本从此也没啥关系了。
var obj = { name :‘zhouxiaohouer‘, age:24, assets:{ cash:1234, stock:22222 }, say:function() { console.log(this.name) } } function deepCopy(o) { var backup = {} for(var key in o){ backup[key] = typeof o[key] === ‘object‘?deepCopy(o[key]):o[key] } return backup } var objb = deepCopy(obj) obj.name = ‘fixed‘ console.log(obj.name)//fixed console.log(objb.name)//zhouxiaohouer
数组的深拷贝则可以借助Array.slice(start[,end])来实现,对象的Object.create方式见面向对象编程系列。