javascript深拷贝
基本类型与引用类型
在JavaScript中,基本类型的是按值复制的,每次复制都是一个副本,各个副本是完全独立的,引用类型的值是按引用复制的,这个值实际上是一个指针,这个指针指向的存储在堆内存中的一个对象,因此无论复制多少份,引用的都是一个对象,更改其中一个所有的引用都会受到影响。
深拷贝与浅拷贝
深拷贝与浅拷贝都是针对相对于引用类型的说法,浅拷贝即普通的复制操作(常用的“=”复制),复制的是对内存地址的引用即上面介绍的。而深拷贝则是开辟一块新的内存地址,修改一个对象,不会改变另一个对象。深拷贝是复制变量值,遇到非基本类型时,则递归至基本类型后再复制。
实现深拷贝的两个方法
递归
var person = {
age : 18,
hobby: ['basketball','read','travel'],
job: 'programmer',
}
function deepCopy(src,dest){
var dest = dest || {} //如果dest为true将dest赋给dest,否则令其为一个空对象
for(var i in src){
if(typeof src[i] === 'object'){
if(Object.prototype.toString.call(src[i]) === '[object Array]'){
//为数组时
dest[i] =[]
}else{
//为对象时
dest[i] = {}
}
//递归
deepCopy(src[i],dest[i])
}else{
dest[i] = src[i]
}
}
return dest
}
var Tom = {name:'Tom'}
result = deepCopy(person,Tom)
result.hobby.push("movie")
console.log(person)
console.log(result)
结果
JSON解析
var person = {
age : 18,
hobby: ['basketball','read','travel'],
job: 'programmer',
}
var result = JSON.parse(JSON.stringify(person))
result.hobby.push("movie")
console.log(person)
console.log(result)
结果与上相同, JSON.stringify() 方法把一个JavaScript对象序列化为一个JSON字符串,JSON.parse() 方法将数据转换为 JavaScript 对象。
b = JSON.parse( JSON.stringify(a) )这种方法的局限性在于无法复制函数