【问题标题】:Self-referenced array with lazy evaluation具有惰性求值的自引用数组
【发布时间】:2015-08-28 19:39:29
【问题描述】:

我在玩 JavaScript 数组,不小心将一个数组推到了它自己的位置。该数组没有因溢出异常而中断,而是懒惰地插入了对自身的引用,该引用继续无限。在一个操作中:

x = [], x.push(x)

我相信会以递归方式插入对自身的引用,但不会在运行时中断。它将生成一个无限的表示:

并且浏览器永远不会冻结或中断,可能是因为点击时该值是“”“已评估”“”。

  • 为什么会这样?
  • V8 如何处理循环引用?
  • 它在现实世界的编程中有什么用处吗?

提前致谢。

【问题讨论】:

  • 不占用无限内存的无限结构并非天生就不稳定或无法使用。 V8 不需要做任何特殊的事情来处理循环引用 AFAIK。例如,这与将链表从前到后连接在一个环中并没有太大区别。我无法理解您为什么认为它不应该起作用。
  • x = {}; x.x = x;

标签: javascript arrays lazy-evaluation


【解决方案1】:
  • 为什么会这样?

虽然图形表示可能会显示无限的“数组”,但实际上您有一个递归数组,因此,内存中只有 1 个 first 元素包含一个数组(但只是指向一个的指针) .如果您将第二个成员添加到第一个数组中,那么它们现在都应该显示相同的成员,因为它们是相同的。

  • V8 如何处理循环引用?

我不知道它是否可以......但我知道 javascript 允许您编写无意义的代码。

  • 它在现实世界的编程中有什么用处吗?

虽然“集合”表示的概念看起来不切实际,但您可以:

  1. 仅包含自身的集合。
  2. 包含所有不包含任何内容的集合的集合(仅当所有其他集合包含其他内容时才填充自身)。
  3. 包含当前被包含的集合的集合。

这些可以用于诸如分组控件之类的东西......

总体而言,自引用通常是“不合理的”,主要是因为在计算机中您已经引用了一个变量(因此不需要额外的自引用)并且通常人们组织他们的程序来促进某些事情......要么减少操作,要么维护或他们喜欢的东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-24
    • 2021-12-25
    • 2010-10-30
    • 1970-01-01
    • 2010-09-20
    • 2017-05-09
    相关资源
    最近更新 更多