gpt4 book ai didi

JavaScript 循环引用问题?

转载 作者:行者123 更新时间:2023-11-28 15:42:47 25 4
gpt4 key购买 nike

我的问题与 JavaScript 中的循环引用有关。基本上我试图创建一个 js 数组并将相同的数组作为属性放入其自身内部。当我在 Firebug 控制台上尝试以下代码时,我无法解释为什么会发生以下输出。

var a = [];
a[a]=a;

//delete(a[a[a[a]]]); edited
delete(a[a][a][a][a]);

console.log(a[a]);
//says undefined. but i deleted the 4th nested level ??

console.log(a);
//still gives []. so a exists.

我的问题是,我只删除了a[a][a][a][a],所以外部属性应该仍然保持正确吗?像 a[a]a[a][a] 不应该是 undefined 对吗?

编辑

但是当我将数组分配为一个属性,键本身就是它本身,并在 firebug 上检查相同的属性时,我能够以嵌套方式扩展对象的键和值,如果它与键一样为 null,则它应该是在检查器中可见吗?

最佳答案

  • 正如您所说,这是一个循环引用 - 因此不存在“第四个嵌套级别”,而只有一个返回自身的
  • 您不应在此处使用 a 作为属性。 JS 中的属性名必须是字符串,当使用空数组作为属性名时,它会自动将 [] 字符串化为 ""。您很幸运,字符串化没有考虑非数字属性。

那么会发生什么:

var a = [];
// OK an empty array.

a[a] = a;
a[""] = a;
// set the "" property of it to itself

delete(a[a[a[a ]]]);
delete a[a[a[a ]]]
delete a[a[a[""]]]
delete a[a[ a ]]
delete a[a[ "" ]]
delete a[ a ]
delete a[ "" ]
// remove the "" property from a

console.log(a[a]);
// is undefined now again

console.log(a);
// still gives []. Is still an array without any items.

请注意,a[a][a][a] === a,因此当您删除 a[a][a][a][a] 它相当于删除a[a]。您可以无限次地跟踪循环引用,但只有一个引用存在然后被删除:

a[""] = a;
// set the "" property of it to itself again

delete(a[""][""][""][""]);
delete a[""] [""] [""] [""]
delete (((a[""])[""])[""])[""]
delete (( a [""])[""])[""]
delete ( a [""])[""]
delete a [""]
// remove the "" property from a again

console.log(a[""]);
// is undefined now again

关于JavaScript 循环引用问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23313168/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com