【发布时间】:2014-02-06 02:28:44
【问题描述】:
当您在 JavaScript (或任何语言)中为变量分配原始类型(例如数字、字符串或布尔值)时,它会在内存中打开一个插槽,将其放入,并在其上贴上标签以供以后引用,对吗?
var a = 1;
var b = 'foobar';
var c = false;
var d;
// What our memory would happen to look like:
var_a => 0x00 [1 ]
var_b => 0x01 ["foobar" ]
var_c => 0x02 [false ]
var_d => 0x03 [undefined ]
现在我的问题是,数组、函数或对象等复合类型如何存储在内存中?我听说对象是在内存中的某个地方创建的,并且该变量仅包含该对象的引用地址。这怎么可能?从我上面输入的内存表来看,内存表似乎只能包含一个值。
内存中是否有用于复合类型的特殊插槽?数组和函数的存储方式是否与对象相同(例如通过引用)?
【问题讨论】:
-
这很大程度上取决于实现。你可以阅读V8 design 并看到对象类似于更传统的实现。如果数组和函数得到更多优化,我不会感到惊讶。
-
js(这里是v8)不像你描述的那样使用内存。var和ram之间至少还有两层抽象。除了数字和字符串之外的所有内容都“按引用”存储。简而言之:不同的引擎在执行您发布的代码时消耗的内存量可能会有所不同。
-
确实如此,但它太抽象了,这方面的资源非常模糊。我已经开始研究 Java,所以我可以了解更多关于内存、它的工作原理和内存管理的知识,但我一直在猜测我对 JavaScript 的了解或我在这方面学到的任何东西。
-
@W3Geek:在内存管理方面,JavaScript 与 Java 非常相似——对象是可变的并作为引用值传递,而原始对象则不是。要学习内存管理,您应该使用 C 或 C++ 等低级语言。
-
@Bergi 如果在学习 Java 之后,我计划学习 C# 或 C++,这样我就可以深入了解内存是如何工作的。由于我是一名网络开发人员,这不是我需要知道的,但如果我知道,那将是一个很大的好处。我对脚本语言的理解要低得多。
标签: javascript variables types composite primitive