javascript 中的无限引用是否存在任何问题(示例)
Are there any issues with infinity references in javascript (example)
当事物以可以无限访问的方式相互引用时,是否存在任何性能问题或令人厌烦的事情?
这是一个例子...
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);
需要注意的一些问题:
- 您不能对具有循环引用的对象调用
JSON.stringify()
。事实上,JSON 格式本身不允许指定循环引用。
- 您不能调用任何内部依赖于
JSON.stringify()
的函数来序列化数据 and/or 通过网络发送扁平化的对象。
- 只有真正聪明的代码(检测并使用循环引用做正确的事情)才能使用循环引用递归地迭代某些东西。如果您的数据中包含循环引用,则使用看起来相对简单的递归迭代器创建无限循环相当容易。递归迭代代码也可以避免循环引用,但是使用 ES6
Set
或 Map
对象比在 ES5. 中更容易透明地做到这一点。
只要您不陷入这些循环迭代之一或需要在 JSON 中表示您的数据结构,就没有什么特别的问题 - 有时它只是权宜之计做事。
浏览器本身就有很多这种循环引用的例子。例如,整个 DOM 有这个作为父指向子和子指向父。
node.firstChild.parentNode.firstChild.parentNode.firstChild.parentNode === node
您遇到的唯一问题是您无法将它们转换为 JSON 格式,仅此而已。
其实浏览器里面已经有这样的情况了。 global object
有一个名为 window
的 属性 引用全局对象。
所以..
window.window.window.window.window === window
当事物以可以无限访问的方式相互引用时,是否存在任何性能问题或令人厌烦的事情?
这是一个例子...
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);
需要注意的一些问题:
- 您不能对具有循环引用的对象调用
JSON.stringify()
。事实上,JSON 格式本身不允许指定循环引用。 - 您不能调用任何内部依赖于
JSON.stringify()
的函数来序列化数据 and/or 通过网络发送扁平化的对象。 - 只有真正聪明的代码(检测并使用循环引用做正确的事情)才能使用循环引用递归地迭代某些东西。如果您的数据中包含循环引用,则使用看起来相对简单的递归迭代器创建无限循环相当容易。递归迭代代码也可以避免循环引用,但是使用 ES6
Set
或Map
对象比在 ES5. 中更容易透明地做到这一点。
只要您不陷入这些循环迭代之一或需要在 JSON 中表示您的数据结构,就没有什么特别的问题 - 有时它只是权宜之计做事。
浏览器本身就有很多这种循环引用的例子。例如,整个 DOM 有这个作为父指向子和子指向父。
node.firstChild.parentNode.firstChild.parentNode.firstChild.parentNode === node
您遇到的唯一问题是您无法将它们转换为 JSON 格式,仅此而已。
其实浏览器里面已经有这样的情况了。 global object
有一个名为 window
的 属性 引用全局对象。
所以..
window.window.window.window.window === window