如何在javascript对象中捕获引用循环?

问题描述

编辑:这被标记为深度克隆问题的重复,但我的问题(参见标题和最后一句话)是关于一种判断对象是否引用自身的方法,深度克隆部分仅用于提供上下文

我正在尝试实现一个函数,它可以让我在不覆盖嵌套字段的情况下深度复制嵌套对象(我知道 lodash 可以解决这个问题,但我宁愿不使用它)。

这是我写的:

function copyObject(target,source) {
    if (typeof target !== "object" || !target) {
        throw 'target nust be a non-null javascript object';
    }
    Object.entries(source).map(([key,value]) => {
        if (typeof value === "object"
                && typeof target[key] === "object"
                && target[key] !== null) {
            copyObject(target[key],value);
        } else {
            target[key] = value;
        }
    })
    return target;
}

问题是,如果它的源参数是一个像这样引用自身的对象(因为它总是会在源的 c 属性调用自己),则该函数将进入无限循环:

let src = {
    a: "a",b: "b",}
src.c = src;

有没有办法知道引用是否是对象的一部分?我认为在 C 中这可以通过查看内存地址来实现,但在 JS 中我不知道。

解决方法

如果我正确理解了这个问题,你应该在 .map func 开头使用下面的代码。

if( Object.is(value,source) ) { 返回 }

MDN 参考:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is

Object.is() 确定两个值是否相同。如果以下条件之一成立,则两个值相同...

  • 都是同一个对象(意味着两个值都引用了内存中的同一个对象)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...