сколько памяти требуется для вар в javascript и когда он выделен? - PullRequest
1 голос
/ 05 апреля 2019

Как в Java

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

но в javascript у нас есть только переменные с типом var.

Q1. Сколько памяти требуется var?

Q2. Когда эта память выделяется для переменной?

Как и в приведенном ниже примере, разные типы данных присваиваются одной и той же переменной

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

1 Ответ

0 голосов
/ 05 апреля 2019

Сколько памяти требуется var?

Мы никогда не узнаем.Он может варьироваться от ничего до нескольких байтов .Это зависит от движка и шагов оптимизации, которые он принимает.Возьмите этот пример:

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

В этом случае unused не может использоваться, и компилятор может решить полностью его оптимизировать, тогда он занимает без памяти .Однако, если вы добавите точку останова в эту функцию, она должна вернуться к неоптимизированной версии и выделить unused.

Или принять следующее:

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

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

Компилятор может оптимизироватьэто может быть сделано несколькими способами:

1) Это ничего не оптимизирует, тогда n может содержать любое возможное значение JavaScript, поэтому, вероятно, оно ссылается на какой-то суперкласс "value" ,Ссылка займет несколько байтов, как и сам экземпляр класса.

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, который работает в Chrome и NodeJS среди других.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...