js delete 删除机理以及它的内存泄露问题的解决方案

delete删除属性时只是解除了属性与对象的绑定,故当属性值为一个对象时,删除时会造成内存泄露 (其实还未删除)
举例:

var person={name:{firstname:'bob'}}
var p=person.name
delete person.name
p.firstname -->'bob'
// 依然可以访问p.firstname,存在内存泄露!!


解决方法,用递归!!

//为何不刚开始就将deleteprop设为递归函数??因为它只有一个值,而若它是对象则内层属性可能存在多个,递归的条件是1. 子问题须与原始问题为同样的事,且更为简单:2. 不能无限制地调用本身,须有个出口,化简为非递归状况处理。
不满足第一条,故必须在内层设置deleteDeep为递归函数!!
function deleteprop(prop){
//var current=obj;
if(typeof prop ==='object')
deleteDeep(prop)

else
delete prop;
function deleteDeep(current){// 递归函数,循环属性值,对于每一个值,若依然为对象则进行递归
for(var i in current){
if(typeof current[i] ==='object')
deleteDeep(current[i])//或者用 arguments.callee(current[i])
else
delete current[i];//expert出口
}
}

}

举例:
person={name:{
first:'bob',
last:'amy',
relative:{
mother:'amy',
father:'peter'}
}
}

var p=person.name.relative;//注意:对象拷贝是引用不是拷贝
p -->{
mother:'amy',
father:'peter'}
}
deleteprop(person.name)

p-->{}//说明已删除!!
由此解决了delete的内存泄露问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值