在javascript中,如果:x=[];x、 推(x);?
在javascript中,如果:x=[];x、 推(x);?,javascript,arrays,recursion,Javascript,Arrays,Recursion,x现在似乎是一个无限深的俄罗斯玩偶式元数组 如果选中x[0][0][0]。。。。添加的[0]索引越多,它仍然返回一个单项数组 但是否有一个有限的深度截止?或者,检查时是否按程序生成新级别?这是我能想到的仅有的两种可能性 var x = []; x.push(x); x现在似乎是一个无限深的俄罗斯玩偶类型的元数组 不是真的x是一个数组。数组中的第一个元素指向与x本身相同的内存位置。不多不少 但是是的,你能做到 var x = []; x.push(x); 您可以随意多次访问,因为您只是一次
x
现在似乎是一个无限深的俄罗斯玩偶式元数组
如果选中x[0][0][0]
。。。。添加的[0]
索引越多,它仍然返回一个单项数组
但是否有一个有限的深度截止?或者,检查时是否按程序生成新级别?这是我能想到的仅有的两种可能性
var x = [];
x.push(x);
x现在似乎是一个无限深的俄罗斯玩偶类型的元数组
不是真的x
是一个数组。数组中的第一个元素指向与x
本身相同的内存位置。不多不少
但是是的,你能做到
var x = [];
x.push(x);
您可以随意多次访问,因为您只是一次又一次地引用同一个内存位置 在任何级别获得x时,都不会生成任何内容。将插入x作为参照 当解引用x[0]时,得到x
x==x[0] 这里没有循环。您正在创建一个空数组并将其设置为
x
。然后下一行x.push(x)
只是将一个空数组推入x
。如果要添加dox,请按(x)
它会再次将一个数组推入第一个索引中有一个空数组的x
。“当您选中“否,您只需添加一个自身引用”时,是否会按程序生成新级别。没有“级别”。您在浏览器中与window.self
:window.self===window
具有相同的功能。因此,您可以执行window.self.self
或window.window.window
。这是循环引用的最短形式。谢谢,这很有意义。变量名x是对内存位置的引用,但对同一对象的引用可以是任意数量的重复引用。我想我很困惑,因为我通常认为数组和对象是包含的分支树结构,但它们当然不必遵守这些结构约束。打破这种思维习惯很好。是的,把它们想象成树是有道理的。在这种情况下,它将更像是一个普通的图形,尽管有一个节点有一个自循环。@Prasanth-我不确定还有什么要说的。我在x上尝试的第一件事是JSON.stringify,并返回了一个错误。我从来不知道有环形结构存在。。你知道这些有什么实际用途吗?@Prasanth我想不出一个对包含自身的数组有用的用例,但很可能存在一个。@Prasanth:我不会说它们有“实际用途”,它们是能够在两个方向上遍历某个对象的结果。例如,DOM节点有一个子节点
属性,允许向下遍历,但也有一个父节点
属性,允许向上遍历。这就产生了一个循环引用。我想你不小心发了两次。你可能想删除一个答案,然后根据需要编辑另一个。是的,我注意到了,并删除了这篇文章。至少我认为我做到了,你还在看我的2张吗?没问题。谢谢你的提醒。
x[0][0][0]