一.什么是堆?什么是栈?
栈:计算机为原始类型开辟的一块内存空间 string number...
堆:计算机为引用类型开辟的一块内存空间 object
二.例子
var a = 'TOM'
var b = a
b = 'TOM2'
console.log(a,b) //TOM TOM2
var c = {key:1}
var d = c
d.key = 2
console.log(c,d) //{key:2} {key:2}
三.什么是深浅拷贝
深拷贝和浅拷贝,简单来说就是:
假设B复制了A,当修改A时,如果B也跟着变了,说明这是浅拷贝
如果B没有变,则是深拷贝
实现浅拷贝的方式:
遍历:使用for(i in 对象){}遍历对象并赋值
Object.create(对象),返回浅拷贝后的值。会把值放在prototype里面
实现深拷贝的方式:
使用遍历回调的方式
使用JSON.parse,JSON.stringify
原理:将object转为string类型,这样就是在栈中开辟的空间
再将string类型转为object
四.深浅拷贝例子
var obj = {
a:'1',
b:{
a:'22',
b:'33'
},
c:['111','222']
}
遍历浅拷贝:
function copyObj(newObj){
var obj = {}
for(var i in newObj){
obj[i] = newObj[i]
}
return obj
}
var cloneObj = copyObj(obj)
cloneObj.b.a='aaa'
console.log(obj)
console.log(cloneObj)
使用Object.create方法实现浅拷贝:
var cloneObj = Object.create(obj)
cloneObj.b.a='aaa'
console.log(obj)
console.log(cloneObj)
遍历深拷贝:
function deepClone(newObj,endObj){
var obj = endObj || {}
for(var i in newObj){
if(typeof(newObj[i])==='object'){
obj[i] = newObj[i].constructor===Array?[]:{}
deepClone(newObj[i],obj[i])
}else{
obj[i] = newObj[i]
}
}
return obj
}
var cloneObj = deepClone(obj)
cloneObj.b.a='aaa'
console.log(obj)
console.log(cloneObj)
通过JSON.parse,JSON.stringify实现深拷贝:
var cloneObj = JSON.parse(JSON.stringify(obj))
cloneObj.b.a='aaa'
console.log(obj)
console.log(cloneObj)