Javascript 参考回路

Javascript 参考回路,javascript,Javascript,我不知道如何更好地描述这一点。就拿这个例子来说 var a = { x: 1, y: 2 }; var b = { z: 3, refA = a }; a.refB = b; 我倾向于认为这种行为是丑陋的。所以充其量,我个人不同意这种编码方式。您不需要这些类型的引用,这样会导致代码难以理解 然而,是否有人认为这样做会带来技术上的损失。Javascript是一种动态语言。您所描述的,在运行时添加属性,是本例中的一个特性。Javascript是一种动态语言。在本例中,您所描述的

我不知道如何更好地描述这一点。就拿这个例子来说

var a = {
  x: 1,
  y: 2 };

var b = {
  z: 3,
  refA = a };

a.refB = b;
我倾向于认为这种行为是丑陋的。所以充其量,我个人不同意这种编码方式。您不需要这些类型的引用,这样会导致代码难以理解


然而,是否有人认为这样做会带来技术上的损失。

Javascript是一种动态语言。您所描述的,在运行时添加属性,是本例中的一个特性。

Javascript是一种动态语言。在本例中,您所描述的内容(在运行时添加属性)是一项功能。

相互引用(您称之为引用循环)对于某些数据结构是必需的。许多树都有从父树指向子树的链接,反之亦然;双链接列表有一个
prev
next
指针

您不喜欢这样做有什么特别的原因吗?

某些数据结构需要相互引用(您称之为引用循环)。许多树都有从父树指向子树的链接,反之亦然;双链接列表有一个
prev
next
指针


你不喜欢这个有什么特别的原因吗?

它被称为循环引用,在某些方面是必要的或无法避免的。最好的例子是一本普通字典——你可以用其他单词解释一个单词的意思。或链接列表


因此,取决于您的用例,它可能是好的,也可能是坏的。

它被称为循环引用,在某些方面是必要的,或者是无法避免的。最好的例子是一本普通字典——你可以用其他单词解释一个单词的意思。或链接列表


因此,取决于您的用例,它可能是好的,也可能是坏的。

我认为引用循环不应该受到任何惩罚。在某些情况下,这也是必要的。例如,客户和账户对象。在account对象中,您将有对customer的引用(一个或多个),而在customer中,您需要对account的引用(可以是多个)

我认为引用循环不应该有任何惩罚。在某些情况下,这也是必要的。例如,客户和账户对象。在account对象中,您将引用customer(一个或多个),而在customer中,您需要引用account(也可以是多个)

没有性能损失。循环引用只是指向彼此的指针,而不是副本。正如前面提到的其他人一样,有时需要循环引用。大多数继承结构使用循环引用来表示父/子关系。有时孩子需要了解父母,父母也需要了解孩子。可以说,它可以让您轻松地在层次结构中上下移动。

没有性能损失。循环引用只是指向彼此的指针,而不是副本。正如前面提到的其他人一样,有时需要循环引用。大多数继承结构使用循环引用来表示父/子关系。有时孩子需要了解父母,父母也需要了解孩子。可以说,这使得在等级阶梯上走来走去变得很容易。

您没有描述这是为了实现什么,因此很难给出任何意见。我认为这样的设置没有任何错误。并非所有实体关系都可以方便地建模为非循环图。您没有描述这是为了实现什么,因此很难给出任何意见。我认为这种设置没有任何错误。并非所有的实体关系都可以方便地建模为非循环图。我不喜欢这样做的原因是A中的方法开始从B调用数据结构,反之亦然。因此,不是A处理本身和B处理本身,而是让彼此互相利用来做事情。这使得追踪谁在哪里做什么变得极其困难。不一定。如果使用访问器和变异器(getter和setter),可以将对A的数据的访问集中到A,对B的访问集中到B。还可以在setter中进行检查,以确保数据一致。这是一种非常普遍的做事方式;如果你不喜欢它或者觉得它很难看,作为一个程序员,你是不会高兴的。是的,我经常这样做,但是我正在看的代码没有这样做。A在变异b,b在变异A,因此调用函数来变异b。我通常的做法是父级>子级,而不是子级对父级执行操作,以防止出现这种意大利面代码。我不喜欢这种情况的原因是,A中的方法开始从b调用数据结构,反之亦然。因此,不是A处理本身和B处理本身,而是让彼此互相利用来做事情。这使得追踪谁在哪里做什么变得极其困难。不一定。如果使用访问器和变异器(getter和setter),可以将对A的数据的访问集中到A,对B的访问集中到B。还可以在setter中进行检查,以确保数据一致。这是一种非常普遍的做事方式;如果你不喜欢它或者觉得它很难看,作为一个程序员,你是不会高兴的。是的,我经常这样做,但是我正在看的代码没有这样做。A在变异b,b在变异A,因此调用函数来变异b。我的常规做法是父级>子级,而不是子级对父级执行操作,以防止出现这种意大利面代码。