如何在 javascript object 中捕获引用循环?
how to catch a reference loop in a javascript object?
编辑:这被标记为深度克隆问题的副本,但我的问题(参见标题和最后一个短语)是关于一种判断 object 是否引用自身的方法,深度克隆部分是只在那里提供上下文
我正在尝试实现一个函数,让我 deep-copy 嵌套 object 而不会覆盖嵌套字段(我知道 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;
}
问题是,如果它的源参数是一个像这样引用自身的 object,这个函数将进入一个无限循环(因为它总是在源的 c 属性 上调用自己):
let src = {
a: "a",
b: "b",
}
src.c = src;
有没有办法知道引用是否是 object 的一部分?我认为在 C 中,这可以通过查看内存地址来实现,但在 JS 中我不知道。
如果我对问题的理解正确,你应该可以在 .map 函数的开头使用下面的代码。
if( Object.is(值, 来源) ) {
return
}
MDN 参考:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is
Object.is()判断两个值是否相同。如果满足以下条件之一,则两个值相同...
- 都是同一个对象(意思是两个值引用内存中的同一个对象)
编辑:这被标记为深度克隆问题的副本,但我的问题(参见标题和最后一个短语)是关于一种判断 object 是否引用自身的方法,深度克隆部分是只在那里提供上下文
我正在尝试实现一个函数,让我 deep-copy 嵌套 object 而不会覆盖嵌套字段(我知道 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;
}
问题是,如果它的源参数是一个像这样引用自身的 object,这个函数将进入一个无限循环(因为它总是在源的 c 属性 上调用自己):
let src = {
a: "a",
b: "b",
}
src.c = src;
有没有办法知道引用是否是 object 的一部分?我认为在 C 中,这可以通过查看内存地址来实现,但在 JS 中我不知道。
如果我对问题的理解正确,你应该可以在 .map 函数的开头使用下面的代码。
if( Object.is(值, 来源) ) { return }
MDN 参考:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is
Object.is()判断两个值是否相同。如果满足以下条件之一,则两个值相同...
- 都是同一个对象(意思是两个值引用内存中的同一个对象)