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

Sye*_*san 6 javascript variables memory-management

就像在java中一样

int requires 4 bytes
float requires 4 bytes
char requires 2 bytes
Run Code Online (Sandbox Code Playgroud)

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

Q1. var 需要多少内存?

Q2。这块内存什么时候分配给变量呢?

如下例所示,不同类型的数据分配给同一变量

int requires 4 bytes
float requires 4 bytes
char requires 2 bytes
Run Code Online (Sandbox Code Playgroud)

Jon*_*lms 4

var 需要多少内存?

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

 function test() {
   var unused = "stuff";
 }
Run Code Online (Sandbox Code Playgroud)

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

或者采取这个:

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

var test = addOne(2);
test = addOne(3);
Run Code Online (Sandbox Code Playgroud)

编译器可以通过几种方式对其进行优化:

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

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

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

 var test = 2 + 1;
 test = test + 1;
Run Code Online (Sandbox Code Playgroud)

现在,如果您这样做,addOne("test")它必须要么回退到未优化的版本,要么为字符串生成新的优化版本。

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

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

这块内存什么时候分配给变量呢?

要么从不,要么当您调用函数时,或者对于全局范围:当代码被解析时,或者当达到赋值时。

 // 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
}
Run Code Online (Sandbox Code Playgroud)

上述优化对于 V8 有详细记录,它在 Chrome 和 NodeJS 等中运行。