a={prop:a}vs a.prop=a:为什么第一个不是循环数据结构

a = {prop: a} vs a.prop = a: why is the first not a circular data structure?

本文关键字:prop 循环 数据结构 vs 为什么 第一个      更新时间:2023-09-26

以下内容之间有什么区别?对我来说,它们看起来是等价的,但其中一个产生了循环数据结构,而另一个则没有。

var a = {};
a = {prop: a};
JSON.stringify(a); // {"prop":{}}
var b = {};
b.prop = b;
JSON.stringify(b); // TypeError: Circular

为什么第2行的prop: a不指向对象a并导致循环数据结构?

{prop: a}在分配给a之前进行评估。当它被求值时,a仍然指原始的空对象。结果是一个具有引用原始对象的属性的新对象。

相反,b.prop = b使用引用该对象的新属性来修改原始b对象。右侧的b不会简单地计算为"没有属性集的普通对象";它指的是一个特定的对象,特别是您正在修改的对象。

a = {prop: a};创建另一个对象,因此在第一种情况下,有两个对象,在第二种情况下只有一个。

为什么2号线上的道具没有指向

确实如此,只是您正在更改a在同一行中引用的对象。

这应该可以回答您的问题:

var a = {prop:a};
console.log(a); //{prop:undefined}

在第一个示例中,您正在重置变量。因此,a.prop是指原始的a。仅仅因为重新分配了标识符a并不会更改对象引用。

在第二个示例中,将b.prop设置为b本身,但不覆盖b。因此,它将以循环结束。