在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/