【问题标题】:Does "undefined" occupy memory in javascript?“未定义”是否占用javascript中的内存?
【发布时间】:2021-10-22 16:15:55
【问题描述】:

在这种情况下var foo;

“foo”会指向内存中包含值undefined 的某个位置吗?

undefined在javascript中是否占用内存? undefined 是否表示没有分配给特定标签的内存地址?

【问题讨论】:

  • ““foo”会指向内存中的某个地方”是什么意思?

标签: javascript frontend


【解决方案1】:

您的问题分为两部分。变量本身和undefined 值的多个副本。

首先,变量可以占用内存空间。并不总是知道它们是否占用空间,因为编译器可以以一种他们可能不会这样做(甚至直接删除)的方式优化您的代码。

关于您问题的另一部分。根据规范,只有一个 undefined 值,但规范不要求实现在内存中保存 undefined 的唯一表示。因此,只要能够保证语言语义,任何实现都可以保存该值的多个副本。

编辑:另外,规范没有指定它在内存中的值表示,所以这也是一个实现细节。

【讨论】:

  • JS在定义作用域(解析)的时候,会搜索声明,对吧?例如`var foo = 2; ` 它将把它看作两部分,第一部分var foo; ,然后在稍后执行时,JS Engine 会为它设置值,就像这样foo = 2; 。所以现在,变量已经设置了两次,第一次设置为“未定义”,然后设置为数字 2。如果我们使用 const 代替。 const 不能指向内存中的新位置。所以,我们不能设置两次?我在这里错过了什么?
  • @Haitham6373 你好像指的是hoisting,不,那不是真的how it works for const。
  • const 永远不会初始化为 undefined 除非您明确这样做。 let 和 const 在到达各自的声明之前不会被初始化,const 总是需要一个初始化器。 const foo; 是一个错误。
【解决方案2】:

您创建的任何类型的变量都会占用内存空间,无论它是使用let、const 还是var 创建的。当您这样做时,您实际上是在告诉 JS 保留内存空间,因为您将在该变量中存储值。 undefined 是 JavaScript 中的一个值,因此,是的,它确实会消耗内存。

有一些关于let 和var 之间性能的测试导致了一些关于哪个更快(see this stack post) 的讨论,并且建议const 用于您拥有不会改变的值。

【讨论】:

  • "证明let 比var 快的测试" - 我在您链接的线程中没有看到任何关于此的声明。单一的基准并不能“证明”任何事情。如果您只是从帖子中删除该句子,那将是完美的答案。
  • 你是对的,我的错。我已经更新了答案。
【解决方案3】:

您在 javascript 中声明的任何变量都将被分配到一个内存位置。如果你在声明时没有初始化变量,那么它将被Javascript分配给undefined。这意味着您声明了一个变量,但尚未分配它。

undefined 是 javascript 中的一个值。 你可以阅读here

【讨论】:

  • JS在定义作用域(解析)的时候,会搜索声明,对吧?例如`var foo = 2; ` 它将把它看作两部分,第一部分var foo; ,然后在稍后执行时,JS Engine 会为其设置值,就像这样foo = 2; 。所以现在,变量已经设置了两次,第一次设置为“未定义”,然后设置为数字 2。如果我们使用 const 代替。 const 不能指向内存中的新位置。所以,我们不能设置两次?我在这里错过了什么?
  • javascript中有一个叫做提升的概念,在这个概念中variable declarations会被移到execution之前的顶部。所以,无论是var、let还是const,所有类型的变量都是一样的。但是在使用const 时,您不能跳过为其赋值。这就是为什么你没有体验提升的原因。你可以阅读更多关于提升developer.mozilla.org/en-US/docs/Glossary/Hoisting
猜你喜欢
  • 2011-09-23
  • 1970-01-01
  • 2016-02-25
  • 1970-01-01
  • 1970-01-01
  • 2016-03-05
  • 1970-01-01
  • 2012-05-17
  • 2017-11-21
相关资源
最近更新 更多