详细地说;值“;在Javascript中

What, in detail, is a "value" in Javascript?

本文关键字:Javascript      更新时间:2023-09-26

我喜欢一个非常基本的描述性定义,特别是以下问题的答案:

  1. 一个值与其作为文字的表示有何不同?

  2. 一个值是否被创建并继续存在,而不管它是否被存储?不管它是否继续使用?

  3. 一个值是一种状态吗?

有趣的问题。

1) 一个值与其作为文字的表示有何不同?

巧克力蛋糕和巧克力蛋糕的配方是不同的文字是一种写下我们希望在程序代码中使用的值的方式。该值是代码运行时内存中实际保存的值。

2) 一个值是否被创建并继续存在,而不管它是否被存储?

一个值只有在内存中才存在,例如,如果它在一个简单变量、一个属性或堆栈中。

不管它是否继续使用?

内存中的值可能会持续存在一段时间,直到垃圾收集器回收它们所在的内存

3) 一个值是一种状态吗?

我可能没有资格回答这个问题,但有条件地我会说"是的"。如果你有一个简单的变量,你把值1放进去,然后你把值2放进去,值1就不在了(或任何地方)。

请注意,值不是唯一的。您可以一次在内存中的许多位置都有值1(而且可能会)。

让我们做一个思想实验:

var a = 42;
var b = a;

在第一行,我们得到了一个定义值42(一个数字)的文字。我们把它放在一个叫做a的简单变量中。现在a中有42个。

在第二行中,我们a中的值复制到b中。现在我们有两个值42的副本,一个在a中,另一个在b中。假设我们这样做:

var c = b * 2;

值从b中读取,值2从文字中创建,JavaScript引擎进行计算,得到值84,并将其放入c中。

让我们考虑一下我们不再使用的价值观:

function foo() {
    var o = {};
    o.p = 42;
    console.log(o.p);
}
foo();

当我们调用foo时,我们创建了一个对象,并使用o中的值记住该对象在内存中的位置。(该值被称为"对象引用";它"告诉"JavaScript引擎对象在哪里。与前面的数值不同,对象实际上不是o中的,该值表示它在o中的位置。)

现在我们做o.p = 42。因此,值42被存储在对象o的一个名为p的属性中,就像它之前在我们的变量a中一样;属性有点像变量,但更花哨。

我们输出该值,然后foo返回。o,唯一一个引用了我们创建的对象的变量,已经消失了。因此,现在对象在内存中,但我们的代码都不知道它在哪里(JavaScript引擎知道,但代码不知道)。最终,如果需要释放对象正在消耗的内存,JavaScript引擎将回收该内存并将其用于其他用途,而p属性所在的内存中的42将消失。