存储在堆栈上的Javascript字符串

时间:2015-10-14 12:38:21

标签: javascript stack primitive

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

  

JavaScript变量中可以存储两种类型的值:原始值和参考值。   原始值具有五种原始数据类型之一:Undefined,Null,Boolean,Number和String。原始值和参考值具有以下特征:

     
      
  • 原始值具有固定大小,因此存储在堆栈的内存中。
  •   

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

  

var a =“ABC”;

     

//或

     

var b =“一些非常刺激的长串...”

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

我相信可以询问有关数字的相同问题......

所以我肯定错过了一些重要的事情。

有人可以解释为什么字符串/数字具有固定大小以及如何将它们存储在堆栈中吗?

2 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:2)

  

原始值具有固定大小,因此存储在堆栈的内存中。

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

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

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

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

在任何情况下,对于JS程序员来说,担心堆栈和堆都介于无意义和分散注意力之间。理解各种类型值的行为更为重要。