当前位置: 首页 > 知识库问答 >
问题:

console.log()显示变量在实际更改值之前的更改值

艾鹭洋
2023-03-14

这段代码我懂。我们复制a并称之为C。当a被改变时,C保持不变

var A = 1;
var C = A;
console.log(C); // 1
A++;
console.log(C); // 1

但是当A是一个数组时,我们有一个不同的判断。不仅C会改变,它甚至在我们接触A之前就改变了

var A = [2, 1];
var C = A;
console.log(C); // [1, 2]
A.sort();
console.log(C); // [1, 2]

有人能解释一下第二个例子中发生了什么吗?

共有2个答案

华煜祺
2023-03-14

Console.log()被传递到对象的引用,因此控制台中的值随着对象的更改而更改。为了避免这种情况,您可以:

console.log(JSON.parse(JSON.stringify(c)))

MDN警告:

请注意,如果您在最新版本的Chrome和Firefox中记录对象,则在控制台中记录的对象是对该对象的引用,在调用console.log()时不一定是对象的“值”,但它是对象在打开控制台时的值。

郗浩
2023-03-14

Pointy的答案有很好的信息,但不是这个问题的正确答案。

OP描述的行为是2010年3月首次报告的bug的一部分,2012年8月为Webkit打了补丁,但截至本文撰写时,尚未集成到Google Chrome中。该行为取决于在将对象文本传递给console.log()时控制台调试窗口是打开还是关闭。

原bug报告(https://bugs.webkit.org/show_bug.cgi?id=35801):

mitch kramer的描述2010-03-05 11:37:45 PST

1)创建具有一个或多个属性的对象文本

2)console。记录对象,但使其关闭(不要在控制台中展开它)

3)将其中一个属性更改为新值

现在打开console.log,您会看到它由于某种原因有了新的值,尽管它在生成时的值是不同的。

我应该指出,如果你打开它,它将保留正确的值,如果这是不清楚的。

一位铬显影剂的回应:

Pavel Feldman评论2 2010-03-09 06:33:36 PST

我想我们永远都解决不了这个问题。我们不能在将对象转储到控制台时克隆对象,也不能监听对象属性的更改以使其始终是实际的。

我们应该确保现有的行为是预期的。

大量的抱怨接踵而至,最终导致了一个错误修复。

2012年8月实施的修补程序的Changelog注释(http://trac.webkit.org/changeset/125174):

到目前为止,将对象(html" target="_blank">html" target="_blank">数组)转储到控制台将导致对象的属性在控制台对象展开时被读取(即懒洋洋地)。这意味着转储相同的对象,同时修改它将很难使用控制台进行调试。

该更改在对象/数组的日志记录时刻开始生成对象/数组的缩写预览,并将此信息传递到前端。这只在前端已经打开时才会发生,它只对console.log()起作用,而不是实时控制台交互。

 类似资料:
  • 问题内容: 我了解的这段代码。我们复制A并将其称为C。当A更改时,C保持不变 但是当A是一个数组时,我们会有不同的情景。C不仅会改变,而且甚至在我们碰到A之前都会改变 有人可以解释第二个示例中发生的情况吗? 问题答案: Pointy的答案有很好的信息,但这不是此问题的正确答案。 OP所描述的行为是一个错误的一部分,该错误于2010年3月首次报告,并于2012年8月为Webkit进行了修补,但截至本

  • 在JavaFX中,如何使用“标签”显示随时间不断变化的值?

  • 问题内容: 我有一个测试用例,可以访问浏览器并对其进行处理。但是我需要以编程方式更改某些文本框的输入内容。我有8个字符串和一个布尔值,表示测试需要正确运行。问题是,您必须先通过ant和构建过程运行测试用例,然后才能实际运行它。我希望能够构建它,将其放在设备上,然后在我调用它时以某种方式将数据传递给设备。但是我不知道那是否可能。我目前唯一想到的选择是编写一个快速的Java程序,将其写入文件,更改变量

  • 问题内容: 这个问题不太可能对将来的访客有所帮助;它仅与较小的地理区域,特定的时间段或极为狭窄的情况(通常不适用于Internet的全球受众)有关。要获得使该问题更广泛适用的帮助,请访问帮助中心。 7年前关闭。 我得到一个页面网址,例如。现在,有人告诉我将b的值更改为5,以使其变为。 即从更改为 注意:此处的变量b可以引用任何名称。 问题答案: 采用 从URL中提取查询字符串 将查询字符串拆分为一

  • 我正在使用Android Studio创建一个应用程序,并使用Firebase模拟后端数据库。目前,我正在尝试使应用程序能够接收并显示我通过Firebase输入的数据。当我使用Firebase data snapshot方法捕获数据时,由于快照发生在内部类中,我无法保存和使用数据。 例如,在Firebase中,我已将“Fri”的值指定给“2步”。如果您查看下面的代码,第一条print语句(内部类内

  • 控制器代码 我想在表格视图中显示之前对数据做一些操作 像秋千 在摇摆,我喜欢这个,它工作得很好。 但不知道如何在tableview javafx上进行操作。