【问题标题】:Are there any issues with infinity references in javascript (example)javascript中的无限引用是否有任何问题(示例)
【发布时间】:2015-12-09 23:21:13
【问题描述】:

当事物以可以无限访问的方式相互引用时,是否有任何性能问题或需要担心的事情?

这是一个例子......

var Foo = function () { 
    var self = this; 

    this.setBar = function (bar) {
        self.bar = bar;
        self.bar.foo = self;
    }
};

var Bar = function () {};

var foo = new Foo();
var bar = new Bar();
foo.setBar(bar);

// infinite references!
console.log(foo.bar.foo.bar.foo); 

【问题讨论】:

    标签: javascript loops reference infinity


    【解决方案1】:

    需要注意的一些问题:

    1. 您不能对具有循环引用的对象调用JSON.stringify()。事实上,JSON 格式本身不允许指定循环引用。
    2. 您不能调用任何内部依赖于JSON.stringify() 的函数来序列化数据和/或通过网络发送展平对象。
    3. 只有真正智能的代码(使用循环引用检测并执行正确的操作)才能递归地使用循环引用迭代某些内容。如果您的数据中有循环引用,那么使用看起来相对简单的递归迭代器创建无限循环是相当容易的。递归迭代代码也可以防止循环引用,但使用 ES6 SetMap 对象比在 ES5 中更容易透明地做到这一点。

    只要您没有陷入这些循环迭代中的任何一个或需要用 JSON 表示您的数据结构,它就没有什么特别的错误 - 有时它只是做事的权宜之计。

    浏览器本身有很多这种循环引用的例子。例如,整个 DOM 都有 this 作为 parent 指向 child,child 指向 parent。

     node.firstChild.parentNode.firstChild.parentNode.firstChild.parentNode === node
    

    【讨论】:

      【解决方案2】:

      您对此类东西的唯一问题是您无法将它们转换为 JSON 格式,但仅此而已。

      实际上,浏览器中已经出现了这样的情况。 global object 有一个名为 window 的属性,它引用回全局对象。

      所以..

      window.window.window.window.window === window
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多