Javascript 字符串存储在堆栈中

Javascript string stored on stack

我正在阅读 Professional JavaScript for Web Developers 3rd ed. 并且在第 4 章的摘要中可以阅读:

Two types of values can be stored in JavaScript variables: primitive values and reference values. Primitive values have one of the five primitive data types: Undefined, Null, Boolean, Number, and String. Primitive and reference values have the following characteristics:

  • Primitive values are of a fixed size and so are stored in memory on the stack.

但我可以有不同的字符串,比如说:

var a = "ABC";

// or

var b = "Some very irritatingly long string..."

它们的大小明显不同,那么它们如何在堆栈上分配?

我相信关于数字也可以问同样的问题...

所以我肯定在这里遗漏了一些重要的东西。

谁能解释一下为什么 strings/numbers 是固定大小的以及如何将它们存储在堆栈中?

字符串(通常是数字)不是固定大小的,也不是完整地存储在堆栈中,但在语言中它们的行为就好像它们可以存储在堆栈中一样。

由实现语言的人决定如何在内部存储数据。通常数据会根据值以不同的方式存储。

虽然 JavaScript 中的数字始终表现为双精度浮点数,但当数字恰好是整数值时,通常会以不同方式存储。一些 JavaScript 引擎使用未使用的双精度值作为整数值,其他一些引擎将整数存储在值本身中,并将双精度值存储在堆上。

对于字符串,一些数据可以存储在堆栈中的项目中,例如长度和对存储在堆中的字符串内容的引用。对于短字符串,字符可以代替引用放入堆栈中的值中,因此不需要堆上的额外数据。

Primitive values are of a fixed size and so are stored in memory on the stack.

这在几个层面上似乎是错误的。

首先,正如您所指出的,它们不是固定大小。

其次,即使它们是,也不一定是将它们存储在 "stack" 上的理由。

第三,我什至不知道"stack"是什么。通常,"stack" 是编译语言上下文中使用的术语,最常指的是包含局部变量的调用框架列表。 JS 引擎如何存储信息是它们内部实现的问题。他们可能使用或不使用类似堆栈的构造,或者将它们用于某些事情而不是其他事情,或者使用一个堆,或多个堆,或包含指向堆的东西的堆栈。无论如何,"stack" 的传统概念不适用于 JS 支持需要在函数完成执行后维护变量绑定的词法闭包。

无论如何,对于 JS 程序员来说,担心栈和堆是介于毫无意义和分心之间的。更重要的是了解各种类型值的行为。