2015-10-14 2 views
4

Я читал Professional JavaScript for Web Developers 3rd ed. и в кратком изложении главы 4 можно прочитать:строка Javascript хранится в стеке

Два типа значений могут быть сохранены в JavaScript переменные: примитивные значения и эталонных значений. Примитивные значения имеют один из пяти примитивных типов данных: Undefined, Null, Boolean, Number и String. Примитивные и опорные значения имеют следующие характеристики:

  • Примитивные значения имеют фиксированный размер и поэтому сохраняются в памяти в стеке.

Но я могу иметь разные строки, скажет:

вар а = "ABC";

// или

вар б = «Некоторые очень раздражающе длинная строка ...»

Они явно отличаются по размеру, так как они могут быть выделены в стеке?

Я считаю, что тот же вопрос может быть задан вопрос о цифрах ...

Так что я наверняка не хватает что-то важное здесь.

Может кто-нибудь объяснить, почему строки/номера имеют фиксированный размер и как их можно хранить в стеке?

+5

Я бы сказал, что «Примитивные значения имеют фиксированный размер и поэтому хранятся в памяти в стеке». Предложение не очень точное. Строка имеет фиксированный размер символа, но обычно это тип с динамическим размером. Я не понимаю, как это может сделать невозможным сохранить его в стеке. –

+3

Номера - это все 64-битные поплавки, вот и все. Строки имеют переменный размер, но в JavaScript они неизменяемы (размер фиксируется после создания). – Touffy

+1

@Touffy Вы уверены? Таким образом, было бы невозможно добавить что-то в строку. –

ответ

2

Строки (и обычно номера) не имеют фиксированного размера и не хранятся полностью в стеке, но в пределах языка они ведут себя так, как если бы они могли храниться в стеке.

Это зависит от того, как реализовать язык, чтобы решить, как хранить данные внутри страны. Часто данные хранятся по-разному в зависимости от значения.

Хотя числа в JavaScript всегда ведут себя как числа двойной точности с плавающей запятой, обычно числа хранятся по-разному, когда они являются целыми значениями. Некоторые JavaScript-движки используют неиспользуемые двойные значения как целочисленные значения, некоторые другие хранят целые числа в самом значении и двойные значения в куче.

Для строк некоторые данные могут храниться в элементе в стеке, например длина и ссылка на содержимое строки, хранящееся в куче. Для коротких строк символы могут вписываться в значение в стеке вместо ссылки и, следовательно, не нуждаются в дополнительных данных в куче.

+0

'Для коротких строк символы могут вписываться в значение в стеке вместо ссылки и, следовательно, не нуждаются в дополнительных данных в куче.' У вас есть ссылки на это. Интересно, правда ли это. –

2

Примитивные значения имеют фиксированный размер и поэтому хранятся в памяти в стеке.

Это кажется неправильным на нескольких уровнях.

Во-первых, как вы указываете, они не фиксированного размера.

Во-вторых, даже если бы они были, это не обязательно причина для их хранения в «стеке».

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

В любом случае, для программиста JS, беспокоясь о штабелях и кучах, где-то между бессмысленным и отвлекающим. Более важно понимать поведение различных типов ценностей.

Смежные вопросы