【问题标题】:JavaScript Primitives and StackJavaScript 基元和堆栈
【发布时间】:2020-05-17 22:23:08
【问题描述】:

我试图了解原始值在堆栈中是如何变化的。 假设我声明并初始化了四个原语:

let myNumber = 12;
let myBool = true;
let myString = "hello";
let myNull = null;

据我所知,它们将像这样存储在堆栈中: stack

那么,如果我这样做:

myNumber = 30;

问题: javascript 引擎是否会从堆栈中弹出 myNull、myString、myBool(并将它们存储在内存中的其他位置),然后将 myNumber 的值更改为 30,然后将 myBool、myString 和 myNull 推回堆栈中?

【问题讨论】:

  • iirc 调用堆栈用于 js 解释器,以帮助在调用子例程时保持其在脚本中的位置。变量声明不是子例程,因此在您的示例中我根本看不到调用堆栈。 developer.mozilla.org/en-US/docs/Glossary/Call_stack
  • “调用栈”通常是指函数调用。请参阅:Understanding the JavaScript call stack。你在这里指的是什么?
  • youtu.be/9ooYYRLdg_g?t=504 这就是我所指的。该视频解释了原语如何被“推送”到称为“堆栈”的内存部分中。但是,它并没有解释当我们改变原语的值时会发生什么。

标签: javascript stack callstack primitive


【解决方案1】:

为原始变量赋值是日常任务。这里要理解的关键点是,当我们为变量赋值时,实际上我们是从堆中为变量分配地址,因为我们知道原始变量在 js 中是不可变的,因此如果值发生变化,那么那里所指的地址发生了变化。 如果我们按照这个概念而不是在我们的调用堆栈中,我们实际上存储的是堆内存位置的地址而不是实际值。 您可以参考下面的媒体链接以更好地理解这一点。 我希望它有所帮助。 :)

https://medium.com/@ethannam/javascripts-memory-model-7c972cd2c239

(注意:也请阅读官方js文档中的垃圾收集器概念,以进一步深入了解原始变量分配和垃圾收集。:)

【讨论】:

    猜你喜欢
    • 2023-03-20
    • 2010-10-14
    • 2021-09-17
    • 2011-09-29
    • 2013-12-05
    • 2014-06-23
    • 1970-01-01
    • 2020-10-24
    • 2021-11-18
    相关资源
    最近更新 更多