js delete 删除机理以及它的内存泄露有关问题的解决方案
js delete 删除机理以及它的内存泄露问题的解决方案
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的内存泄露问题