如何检测并避免循环依赖
Issue 欢迎在 Gtihub Issue 中回答此问题: Issue 525
Author 回答者: haotie1990
function isCircularReference(value) {
const isObject = (value) =>
Object.prototype.toString.call(value) === "[object Object]";
const isPrimitive = (value) =>
/Number|Boolean|String|Undefined|Null|Symbol/.test(
Object.prototype.toString.call(value),
);
const memory = new WeakMap();
let isCycled = false;
const traverse = function (value) {
if (!isPrimitive(value)) {
if (memory.has(value)) {
isCycled = true;
return;
}
memory.set(value, true);
const keys = Object.keys(value);
for (const key of keys) {
traverse(value[key]);
}
}
};
traverse(value);
return isCycled;
}