gpt4 book ai didi

Javascript:循环结构对象?什么情况下使用这个?

转载 作者:行者123 更新时间:2023-12-03 00:36:48 25 4
gpt4 key购买 nike

为什么我运行以下 javaScript 代码时没有报告错误。

var t = { r: 2};
var c = {};
c.y = t.r = t;

console.log(t);
console.log(c);

什么场景会使用c.y = t.r = t ?谢谢~

  1. 我们可以使用循环结构对象吗?为什么不报错?
  2. 什么场景会使用循环结构对象?

最佳答案

让我们将其分解为单独的语句。首先,你需要知道作业已经完成,这样你总是评估右边的东西,然后把它们放到左边。

例如var x = 1 + 2 表示“将 1 和 2 加在一起。然后将值放入 x”。

第一步:

var t = { r: 2};

如果我们首先评估赋值的右侧,则意味着您首先创建一个对象 { r :2 }。然后“将此对象放入 t”,或将此对象的引用分配给变量t:

下一步,类似。现在您创建另一个对象。您将其引用分配给 c

var c = {};

到目前为止一切都很酷。现在下一行代码是一个骗子:

c.y = t.r = t;

让我们来分解一下。还记得先评估右侧吗?但是代码是从左到右读的吗?意思是,我们首先计算t.r = t,然后将结果放入c.y

所以让我们首先评估t.r = t。意思是将t的值放入t.r中。正如我们在开头所说,t 的值是对某个对象的引用

所以求值的结果是一个指向对象的指针。我们将该指向对象的指针放入对象 tr 属性中。哦,顺便说一句,我们指向的对象是 t 本身 - 但这并不重要。

我们最终得到的是一个具有一个属性的对象,r。并且该属性持有一个指向自身的指针。

明白棘手的部分了吗?不?不要在评论中要求更多解释,我可以在这里更深入一些。

现在最后一部分是,我们说我们将计算 t.r = t 的结果 - 如果你还记得的话,其结果是一个具有指向自身的属性的对象 -我们将生成的对象放入 c.y 中。

所以我们最终得到了一个循环结构:

  1. c 是一个对象
  2. c 有一个属性 y
  3. y 持有指向 t 的指针
  4. t 是一个对象
  5. t 有一个属性 r
  6. r 也指向上面的 t(步骤 4)

    console.log(t);console.log(c);

<小时/>

编辑:回答问题(它们是在我开始回答后添加的)。

1. Can we use a circular reference object? Why no error?

我想很明显,在 JavaScript 中使用循环引用是合法的。对象属性可以指向对象本身。尽管它可能很危险,但这并不能阻止您这样做。

2. In which scenario would we use circular references?

这通常被认为是一种不好的做法。然而,该规则也有一些异常(exception)。一个例子是父子关系 - 子对象有时可能需要父对象的属性,因此对其进行引用会很有帮助。或者在某些情况下,您可以在闭包中使用它来绕过对象引用的重要包装。

或者与给定模块内部的库类似的情况。

强耦合、断线等问题JSON 序列化器等仍然存在,因此“正确”执行操作并且没有循环引用通常更简单。

关于Javascript:循环结构对象?什么情况下使用这个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53627489/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com