存储在堆栈上的Javascript字符串

存储在堆栈上的Javascript字符串,javascript,stack,primitive,Javascript,Stack,Primitive,我正在阅读,在第四章的总结中,可以看到: JavaScript变量中可以存储两种类型的值:原语值和引用值。 基本值有五种基本数据类型之一:未定义、Null、Boolean、Number和String。基本值和参考值具有以下特征: 原语值的大小是固定的,因此存储在堆栈的内存中 但我可以有不同的字符串,比如: var a=“ABC” //或 var b=“一些非常令人恼火的长字符串…” 它们的大小明显不同,那么如何在堆栈上分配它们呢 我相信关于数字也可以问同样的问题 因此,我肯定在这里遗漏了一些

我正在阅读,在第四章的总结中,可以看到:

JavaScript变量中可以存储两种类型的值:原语值和引用值。 基本值有五种基本数据类型之一:未定义、Null、Boolean、Number和String。基本值和参考值具有以下特征:

  • 原语值的大小是固定的,因此存储在堆栈的内存中
但我可以有不同的字符串,比如:

var a=“ABC”

//或

var b=“一些非常令人恼火的长字符串…”

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

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

因此,我肯定在这里遗漏了一些重要的东西

有人能解释为什么字符串/数字是固定大小的,以及它们如何存储在堆栈上吗?

字符串(通常是数字)不是固定大小的,也不是全部存储在堆栈上,而是在语言中,它们的行为就像可以存储在堆栈上一样

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

尽管JavaScript中的数字总是表现为双精度浮点数,但当它们恰好是整数值时,通常会以不同的方式存储。一些JavaScript引擎使用未使用的双精度值作为整数值,一些其他引擎在值本身中存储整数,在堆中存储双精度值

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

原语值的大小是固定的,因此存储在堆栈的内存中

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

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

其次,即使它们是,也不一定是将它们存储在“堆栈”上的原因

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


在任何情况下,对于JS程序员来说,担心堆栈和堆都是毫无意义和令人分心的。理解各种类型的值的行为更为重要。

我要说,
原始值的大小是固定的,因此存储在堆栈的内存中。
语句不是很准确。字符串具有固定的字符大小,但通常是动态大小的类型。我不明白这怎么会使它不可能保持在堆栈上。数字都是64位浮点,仅此而已。字符串的大小是可变的,但在JavaScript中它们是不可变的(创建后大小是固定的)。@Touffy你确定吗?这样就不可能向字符串中添加内容。当您“向字符串中添加内容”时,将创建一个新字符串来保存结果。这就是为什么按顺序使用大量的
+
进行子字符串累加是一种不好的做法(因为速度慢),您应该改用array.join()。@RoboRobok当您连接或以其他方式“更改”时,会创建一个新字符串。因此变量的引用将发生变化。'对于短字符串,字符可以放在堆栈中的值中代替引用,因此堆上不需要额外的数据。'您对此有任何引用吗。我想知道这是不是真的。