2014-02-05 3 views
0

Когда вы назначаете примитивный тип, такой как число, строка или логическое значение для переменной в JavaScript (или любой другой язык), он открывает слот в памяти, помещает его и помещает на нем метку, на которую ссылаются позже, правильно?Назначение примитивного типа vs Composite-type для переменной

var a = 1; 
var b = 'foobar'; 
var c = false; 
var d; 

// What our memory would happen to look like: 
var_a => 0x00 [1   ] 
var_b => 0x01 ["foobar" ] 
var_c => 0x02 [false  ] 
var_d => 0x03 [undefined ] 

Теперь вот мой вопрос, как композитные-типы, такие как массивы, функции или объекты, хранящиеся в памяти? Я слышал, что объекты создаются где-то в памяти, а переменная содержит только ссылочный адрес этого объекта. Как это возможно? Из таблицы памяти, которую я напечатал выше, кажется, что таблицы памяти могут содержать только одно значение.

Есть ли специальные слоты в памяти для композитных типов? Являются ли массивы и функции сохранены так же, как объекты (например, по ссылке)?

+2

Это очень зависит от реализации. Вы можете прочитать о [дизайн V8] (https://developers.google.com/v8/design) и увидеть, что объекты похожи на более традиционные реализации. Я не удивлюсь, если массивы и функции будут оптимизированы еще больше. – Tibos

+0

js (v8 здесь) не использует память, как вы описываете. Есть как минимум еще два слоя абстракции между var и ram. О всем, кроме номеров и строк, хранится «по ref». Короче говоря, разные двигатели могут варьироваться в зависимости от объема, который они используют для выполнения кода, который вы опубликовали. – dandavis

+0

Это правда, но это настолько абстрактно, и ресурсы на этом очень расплывчаты. Я начал смотреть на Java, чтобы я мог больше узнать о памяти, о том, как она работает, и об управлении памятью, но я продолжаю угадывать свои знания о JavaScript или что-то, что я узнал по этому поводу. – W3Geek

ответ

1
Объекты

создаются где-то в памяти, а переменная содержит только ссылочный адрес этого объекта.

Да.

Как это возможно? Из таблицы памяти, которую я напечатал выше, кажется, что таблицы памяти могут содержать только одно значение.

Ссылка адрес (так называемый «указатель») является одно значение.

Есть ли специальные слоты в памяти для композитных типов?

Да. Композиты, также называемые «struct» s, могут содержать несколько значений (но их фиксированное количество), например «строка для имени, ссылка на следующее свойство и поле для значения» для одной ссылки при описании объект как связанный список. Объекты JavaScript высокого уровня хранятся в виде множества различных структур, объединенных вместе для представления данных.

Являются ли массивы и функции сохранены так же, как объекты (например, по ссылке)?

Да. Однако их структуры данных отличаются друг от друга, они оптимизированы для разных целей.

+0

Это имеет больший смысл. Спасибо за ваш ответ. Думая о том, что теперь объекты могут представлять объекты реальной жизни, такие как лицо, банковский счет или автомобиль, где примитивные данные просто не могут * (не так легко) *. Композитные данные состоят из нескольких примитивов. – W3Geek