JavaScript 中的循环对象引用是如何工作的?
How does a circular object reference work in JavaScript?
这个问题源于一个练习,该练习促使我创建一个圆形对象,这样,在伪代码中,
circular.value === "Hello World"
circular === circular.self
circular.self === circular.self.self
...等等。
我注意到如果我像这样构造一个对象字面量,
var circular= {
value: 'Hello World',
self: circular
}
那么circular.self
就是undefined
。但是,如果我构建一个空对象,然后将值分配给这样的属性,
var circular = {};
circular.value = 'Hello World',
circular.self = circular;
那么circular.self
(或circular.self.self.self.self.self
)就是{ value: 'Hello World', self: [Circular] }
。无论我在这些示例中将 属性 命名为 self
,都是如此。
所以我的具体问题是,是什么导致前一个示例中的 circular.self
变为 undefined
,而后一个示例中的行为却符合我的预期?
var circular
是(因为它使用 var
关键字)提升并在创建范围时在当前范围内声明一个变量(即当输入函数或全局范围时)。它以 undefined
的值开始
{ ... }
创建一个新对象并作为对它的引用求值。
circular = { ... }
获取该引用并将其分配给 circular
.
赋值直到对象文字语法被评估后。
如果您尝试在对象字面量语法中读取 circular
的值,它将是 undefined
因为您在 赋值发生之前这样做 .
在第二个示例中,在您尝试读取 circular
的值之前,对象存在并且引用已分配给 circular
。然后可以修改该对象以添加一个新的 属性,其值为该引用。
这个问题源于一个练习,该练习促使我创建一个圆形对象,这样,在伪代码中,
circular.value === "Hello World"
circular === circular.self
circular.self === circular.self.self
...等等。
我注意到如果我像这样构造一个对象字面量,
var circular= {
value: 'Hello World',
self: circular
}
那么circular.self
就是undefined
。但是,如果我构建一个空对象,然后将值分配给这样的属性,
var circular = {};
circular.value = 'Hello World',
circular.self = circular;
那么circular.self
(或circular.self.self.self.self.self
)就是{ value: 'Hello World', self: [Circular] }
。无论我在这些示例中将 属性 命名为 self
,都是如此。
所以我的具体问题是,是什么导致前一个示例中的 circular.self
变为 undefined
,而后一个示例中的行为却符合我的预期?
var circular
是(因为它使用 var
关键字)提升并在创建范围时在当前范围内声明一个变量(即当输入函数或全局范围时)。它以 undefined
{ ... }
创建一个新对象并作为对它的引用求值。
circular = { ... }
获取该引用并将其分配给 circular
.
赋值直到对象文字语法被评估后。
如果您尝试在对象字面量语法中读取 circular
的值,它将是 undefined
因为您在 赋值发生之前这样做 .
在第二个示例中,在您尝试读取 circular
的值之前,对象存在并且引用已分配给 circular
。然后可以修改该对象以添加一个新的 属性,其值为该引用。