1.在JavaScript中基本数据类型保存在栈中,而复杂数据类型(引用数据类型)存放在堆中。
2.拷贝:其实就是复制,在JavaScript中拷贝又分为浅拷贝和深拷贝。无论是浅拷贝还是深拷贝都只适合于对象或者数组这类复杂数据类型(引用数据类型)。
3.浅拷贝和深拷贝的区别:
浅拷贝:只是拷贝数据的内存地址,让新的数组或者对象能够引用原数据。彼此之间的操作会互相影响。
深拷贝:是在内存中开辟一个新的存储空间,完完全全的拷贝一整个一模一样的对象(数组),将原对象的所有内容全部复制过来。和原对象(数组)完全分隔,彼此之间的操作互不影响。
4.浅拷贝就是创建一个新的对象(数组)让其指向原来的数据地址,引用原数据;新对象对数据进行操作时,原对象数据也会发生改变。例如:
var obj1 = {
name:"xiaozhang",
age:21,
height:180
}
var obj2 = obj1
console.log(obj2)
obj2.weight = 60
console.log(obj1)
5.深拷贝会在内存中重新开辟一段新的存储空间,将原对象的所有内容全拷贝到新的存储空间内。使得两个对象(数组)指向两个不同的堆内存数据。从而实现改变互不影响。例如:
var arr = [10, 20, 30, [1, 2, [3, 4]]]
function deepcope(data) {
if (typeof(data) == "object") {
if (data == null) {
return null
} else if (data.constructor == Date()) {
return new Date(data.getTime())
} else if (data.constructor == RegExp) {
return new RegExp(data)
} else {
var newobj = new data.constructor()
for (var key in data) {
newobj[key] = arguments.callee(data[key])
}
return newobj
}
} else {
return data
}
}
var arr2 = deepcope(arr)
console.log(arr2)
arr2.push(55,66)
console.log(arr2)
console.log(arr)
6.对象的深拷贝也可以用JSON.stringify()和JSON.parse()来实现:
var obj = {name:"xiaozhang"}
var str = JSON.stringify(obj)
var obj2 = JSON.parse(str)
console.log(obj2)
obj2.age = 21
console.log(obj2)
console.log(obj)
var obj = {x1:null,x2:new Date(),x3:"hello",son:{age:20}}
var obj2 = JSON.parse(JSON.stringify(obj))
obj2.son.age = 300
console.log(obj2) //会改变数据类型
以上这两种方式虽然都可以实现深拷贝,但是这两种方法使用时存在缺陷,当对象里面有引用数据类型、时间、正则表达式 等时,数据解析会出现问题;所以上面这两种用JSON.stringify()和JSON.parse()的方式都不推荐使用。