javascript - javascript中的var需要多少内存以及何时分配?

标签 javascript variables memory-management

在Java中

int requires 4 bytes
float requires 4 bytes
char requires 2 bytes

但是在 javascript 中我们只有 var 类型的变量。

Q1. How much memory var requires?

Q2. When this memory is allocated to the variable?

在下面的例子中,不同类型的数据被分配给同一个变量

var a = 1;
console.log(a, typeof a);
a = "javascript";
console.log(a, typeof a );

最佳答案

How much memory var requires?

我们永远不会知道。它的范围可以从几个字节。这取决于引擎,以及它采取的优化步骤。举个例子:

 function test() {
   var unused = "stuff";
 }

在这种情况下 unused 无法使用,编译器可能会决定将其完全优化掉,然后它不占用内存。但是,如果您在该函数中添加断点,它必须退回到未优化的版本并且必须分配 unused

或者拿这个:

function addOne(n) { return n + 1; }

var test = addOne(2);
test = addOne(3);

编译器可以通过几种方式优化它:

1) 它不优化任何东西,然后 n 可能包含任何可能的 JavaScript 值,因此它可能引用某种 "value" superclass .引用将占用几个字节,类实例本身也是如此。

2) 它假定 n 始终是一个数字(因为它从调用中看到了这一点),并生成优化的字节码,该字节码仅将一个数字(或整数)分配到堆栈上。这将占用 8 个字节(可能更少/更多)。

3) 它完全内联函数,n 根本不存在。生成的代码是:

 var test = 2 + 1;
 test = test + 1;

现在,如果您执行 addOne("test"),它必须退回到未优化的版本,或者为字符串生成新的优化版本。

由于这是所有(大多数)引擎正在做的事情,您永远不知道变量占用了多少空间,因为它可以在运行时更改(多次)。它甚至可以根据您调用它的方式而改变,无论您是在某个时候调用 eval 还是 with,以及您是否使用调试器来“查看”函数。

对于全局变量(如您的情况),引擎可能无法进行优化(因为代码的很多部分都可以与之交互),因此情况 1 可能适用。

When this memory is allocated to the variable?

从不,或者当您调用函数,或者对于全局范围:当代码被解析时,或者当任务完成时

 // assuming a non optimized case:
function test() { // a reference holder for a gets allocated
   let a;
   a = {}; // an object gets allocated, a reference to it gets stored in the already allocated slot
}

上面的优化是well documented适用于 V8,它在 Chrome 和 NodeJS 等中运行。

关于javascript - javascript中的var需要多少内存以及何时分配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55533557/

相关文章:

javascript - 根据下拉选择隐藏或显示 div

javascript - Angular $http 成功弃用修正案

javascript - 从 ArcGIS JavaScript API map 对象获取 JSON WebMap

javascript - 似乎无法将 JS 参数(变量)传递给 Google Map API v3 函数

c - float变量不满足条件(C)

c++ - 本地址中的内容被换出和返回时,存储在指针中的地址会发生什么变化?

javascript - 使用纯 Javascript 取消选中单选按钮

R - 使用 for 循环测试多个数据帧

c - 指针可以指向未分配的内存吗?

没有清除命令的 MATLAB 释放内存