对象中存在循环引用的意思
var obj = {
name: 'dpn',
a: {
b:{}
}
}
obj.a.b= obj
在对象 obj 中存在某个属性值或者这个属性里面的属性值 === obj的情况就是对象中存在循环引用
如上:也就是 obj 这个对象中有一个属性 a ,这个属性的属性值是一个对象,a这个对象里面有一个属性 b ,这个属性b的属性值是一个对象
然后这个对象的值就是 obj 这个对象本身
这个 obj 对象被循环引用了
检测对象中是否存在循环引用
基本思路:
首先定义一个值【flag】,最后用来返回结果【是否存在循环引用】
因为对象的检测可能会是好几层,所以会用到递归
形参一个是原始的【obj】,一个是递归传过来的新的 【newobj】
先进行循环遍历对象
然后判断对象属性的数据类型是否是对象 //如果不是直接就返回了
如果是的话就判断该属性值是否等于原始【obj】的值
如果等于就把 flag 的值改为true并返回
因为它是一个对象,所以不等于就会把这个属性值赋值给新对象【newobj】,然后进行递归再次调用,知道遍历结束或者已经检测出存在
代码如下:
function cicle (obj) {
var flag = false
var o = newobj || obj
for (let item in o) {
if(typeof(o[item]) === 'object') {
if(o[item] === obj) {
flag = true
} else {
newobj = o[item]
flag = cicle(obj, newobj)
}
}
}
return flag
}
var obj = {
name: 'dpn',
a: {
b:{}
}
}
obj.a.b= obj
var result = cicle(obj)
console.log(result); //true