By Noxxxx from https://interview.noxxxx.com/?post_type=post&p=14 上山打老虎
    欢迎分享与聚合,尊重版权,可以联系授权
可以通过 WeakMap 来保存每次遍历的对象,并合当前的对象进行比对,如果一致则认为存在循环引用。
为什么要用 WeakMap ?因为 WeakMap 是对对象的“弱”引用,一旦对象被清除,则其自身也会被垃圾回收。
示例代码
function isObject(obj) {
  return Object.prototype.toString.call(obj) === "[object Object]";
}
function isCircularReference(obj) {
  const store = new WeakMap();
  let flag = false;
  const traverse = (data) => {
    if (isObject(data)) {
      if (store.has(data)) {
        flag = true;
        return;
      }
      store.set(data, true);
      const keys = Object.keys(data);
      keys.forEach((key) => {
        traverse(data[key]);
      });
    }
  };
  traverse(obj);
  return flag;
}
var a = {
  b: 1,
  c: 2
};
a.c = a;
console.log(isCircularReference(a));
See the Pen JS 编程题 – 如何判断是否存在循环引用 by hjoker (@hjoker) on CodePen.