Javascript:循环结构对象?在什么情况下使用此功能?

时间:2018-12-05 07:47:44

标签: javascript javascript-objects

为什么我在遵循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. 什么情况下将使用循环结构对象?

1 个答案:

答案 0 :(得分:1)

让我们将其分解为单独的语句。首先,您需要知道分配已完成,以便您始终评估右侧的内容,然后将其放在左侧。

例如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的值是对某个对象的引用

因此,求值结果是指向对象的指针。我们将指向对象的指针放入对象r的{​​{1}}属性中。哦,顺便说一句,我们指向的对象是t本身-没关系。

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

有棘手的部分吗?没有?不要求在评论中提供更多解释,我可以在这里进一步介绍。

现在最后一部分是,我们说的是,我们将求值r的结果-如果您还记得的话,其结果是一个对象,该对象的属性指向自身-我们将其结果对象放入t.r = t

所以我们最终得到了一个圆形结构:

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

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


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

c.y

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

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

通常认为这是一种不良做法。但是,该规则也有一些例外。一个示例是父子关系-子对象有时可能需要父级的属性,因此对其进行引用会有所帮助。或者在某些情况下,您可以在闭包中使用它来避免对象引用的非平凡包装。

或类似情况,具有给定模块内部的库。

诸如强耦合,断裂等问题保留了JSON序列化程序等,因此“适当地”执行操作而没有循环引用通常更简单。