就像在java中一样
int requires 4 bytes
float requires 4 bytes
char requires 2 bytes
但在javascript中我们只有var类型的变量。
Q1。内存变量需要多少?
Q2。当这个内存分配给变量?
如下例所示,不同类型的数据被分配给同一个变量
var a = 1;
console.log(a, typeof a);
a = "javascript";
console.log(a, typeof a );
内存变量需要多少?
我们永远不会知道。它可以从无到有几个字节。这取决于引擎及其所采用的优化步骤。举个例子:
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可能适用。
当这个内存分配给变量?
从来没有,或者在调用函数时,或者在全局范围内:解析代码时,或者达到赋值时。
// 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
}
上面的优化是针对V8的well documented,它在Chrome和NodeJS等中运行。