【问题标题】:Assigning Primitive-type vs Composite-type to a Variable将原始类型与复合类型分配给变量
【发布时间】: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


【解决方案1】:

对象是在内存中某处创建的,变量只包含该对象的引用地址。

是的。

这怎么可能?从我上面输入的内存表来看,内存表似乎只能包含一个值。

引用地址(称为“指针”)是单个值。

内存中是否有用于复合类型的特殊插槽?

是的。组合,也称为“结构”,可以包含多个值(但数量固定),例如描述时单个链接的“名称字符串、对下一个属性的引用和值的字段”一个对象作为一个链表。高级 JavaScript 对象存储为多种不同的结构,它们连接在一起以表示数据。

数组和函数的存储方式是否与对象相同(例如通过引用)?

是的。但是,它们的数据结构不同,它们针对不同的事物进行了优化。

【讨论】:

  • 这更有意义。感谢您对此的回答。现在想想,这就是为什么对象可以代表现实生活中的实体,例如人、银行账户或汽车,而原始数据根本无法(无论如何都不容易)。复合数据由几个基元组成。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-06
  • 1970-01-01
  • 1970-01-01
  • 2018-05-06
  • 2018-06-02
相关资源
最近更新 更多