为什么我在遵循javaScript代码时没有报告错误。
var t = { r: 2};
var c = {};
c.y = t.r = t;
console.log(t);
console.log(c);
什么情况下将使用c.y = t.r = t
?谢谢〜
答案 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
。
所以我们最终得到了一个圆形结构:
r也指向上方的t(第4步)
console.log(t); console.log(c);
编辑:(回答问题是在我开始回答后添加的)。
c.y
我想很明显,是的,使用循环引用在JavaScript中是合法的。对象属性可以指向对象本身。它可能很危险并不能阻止您这样做。
1. Can we use a circular reference object? Why no error?
通常认为这是一种不良做法。但是,该规则也有一些例外。一个示例是父子关系-子对象有时可能需要父级的属性,因此对其进行引用会有所帮助。或者在某些情况下,您可以在闭包中使用它来避免对象引用的非平凡包装。
或类似情况,具有给定模块内部的库。
诸如强耦合,断裂等问题保留了JSON序列化程序等,因此“适当地”执行操作而没有循环引用通常更简单。