我正在阅读Professional JavaScript for Web Developers 3rd ed.,在第4章的摘要中可以读到:
JavaScript变量中可以存储两种类型的值:原始值和参考值。 原始值具有五种原始数据类型之一:Undefined,Null,Boolean,Number和String。原始值和参考值具有以下特征:
- 原始值具有固定大小,因此存储在堆栈的内存中。
但我可以有不同的字符串,比如说:
var a =“ABC”;
//或
var b =“一些非常刺激的长串...”
它们的大小明显不同,那么它们如何在堆栈中分配?
我相信可以询问有关数字的相同问题......
所以我肯定错过了一些重要的事情。
有人可以解释为什么字符串/数字具有固定大小以及如何将它们存储在堆栈中吗?
答案 0 :(得分:2)
字符串(通常是数字)不是固定大小的,并且不是完整地存储在堆栈中,而是在它们的语言中,就好像它们可以存储在堆栈中一样。
由实现该语言的人决定如何在内部存储数据。通常,数据会以不同的方式存储,具体取决于值。
虽然JavaScript中的数字总是表现为双精度浮点数,但通常数字在它们恰好是整数值时会以不同方式存储。一些JavaScript引擎使用未使用的double值作为整数值,其他一些使用整数值存储值本身和堆上的double值。
对于字符串,某些数据可以存储在堆栈中的项目中,例如长度和对堆上存储的字符串内容的引用。对于短字符串,字符可以适合堆栈中的值而不是引用,因此堆上不需要额外的数据。
答案 1 :(得分:2)
原始值具有固定大小,因此存储在堆栈的内存中。
这在几个层面上似乎都是错误的。
首先,正如您所指出的那样,它们不是的固定大小。
其次,即使它们存在,也不一定是将它们存储在“堆栈”中的原因。
第三,我甚至不知道“堆栈”是什么。通常,“堆栈”是在编译语言的上下文中使用的术语,通常指的是包含局部变量的调用帧列表。 JS引擎如何存储信息是其内部实现的问题。他们可能使用或不使用类似堆栈的结构,或者将它们用于某些事情,而不是其他东西,或使用一个堆,或许多堆,或包含指向堆的东西的堆栈。在任何情况下,传统的“堆栈”概念都不适用于JS支持在函数完成执行后需要维护变量绑定的词法闭包的程度。
在任何情况下,对于JS程序员来说,担心堆栈和堆都介于无意义和分散注意力之间。理解各种类型值的行为更为重要。