haizlin / fe-interview

前端面试每日 3+1,以面试题来驱动学习,提倡每日学习与思考,每天进步一点!每天早上5点纯手工发布面试题(死磕自己,愉悦大家),6000+道前端面试题全面覆盖,HTML/CSS/JavaScript/Vue/React/Nodejs/TypeScript/ECMAScritpt/Webpack/Jquery/小程序/软技能……
http://www.h-camel.com
MIT License
25.32k stars 3.25k forks source link

[js] 第1907天 怎样判断某个js对象是否存在循环引用? #5871

Open haizhilin2013 opened 3 months ago

haizhilin2013 commented 3 months ago

第1907天 怎样判断某个js对象是否存在循环引用?

3+1官网

我也要出题

nulllfeng commented 1 month ago

第一种方式简单粗暴直接使用 JOSN.stringify ,当对象存在循环引用时会抛出异常:

function hasCircularReference(obj) {
    try {
        JSON.stringify(obj);
    } catch (error) {
        return false;
    }
    return true;
}

第二种方式将遍历过的对象用 Set 记录下来,已经记录过的说明存在循环引用:

function hasCircularReference(obj) {
    const cache = new Set();
    const list = [obj];
    while(list.length) {
        const item = list.pop();
        if (item === null || typeof(item) !== 'object') continue;
        if (cache.has(item)) {
            cache.clear();
            return true;
        }
        cache.add(item);
        list.push(...Object.values(item));
    }
    cache.clear();
    return false;
}