JavaScript有内存堆吗?

时间:2009-06-22 10:42:34

标签: javascript

换句话说,我有什么选择在JavaScript中分配内存?

我知道你可以全局或在函数范围内分配内存。我可以动态分配内存吗? new运算符到底意味着什么?

编辑:这是一个具体的例子。您将如何实现从用户读取整数值 - n,然后将n整数读入数组?

7 个答案:

答案 0 :(得分:24)

你无法分配内存。你可以创建对象。这就是new的作用。

现在,javascript是一个奇怪的生物:函数也是javascript中的对象。所以这意味着您可以使用new实例化所有内容。

因此,new运算符意味着正在创建一个新对象。

Javascript也会垃圾收集这些变量,就像它在java中一样。所以,如果你了解java,你应该很容易画出相似之处。

欢呼声,

JRH

PS:当你分配对象时,你真的在​​分配内存。只是,你没有明确地这样做。你可以分配一个数组,并使其行为像内存缓冲区,但这会大大降低javascript的性能:javascript数组不是内存缓冲区,它们也是对象(就像其他所有东西一样)。

答案 1 :(得分:7)

JavaScript有垃圾收集并为您处理。

但是,您可以在适当的情况下使用delete运算符来帮助它。

来自Apple JavaScript Coding Guidelines

  

就像你使用new运算符一样   创建一个对象,你应该删除   完成后的对象   他们,像这样:

     

delete myObjectVariable;

     

自动运行JavaScript运行时   垃圾收集对象时   value设置为null。但是,设定   null的对象不会删除   引用该对象的变量   从记忆里。使用删除确保   此内存还可以回收   到对象使用的内存   本身。 (这也更容易看到   您分配和分配的地方   如果你,解除分配是不平衡的   显式调用delete。)

史蒂夫

答案 2 :(得分:4)

对我来说,嗯,听起来像是来自以记忆为中心的语言,并试图将这种逻辑转变为JS。是的JS使用内存(当然),但我们有垃圾收集来处理清理它。

如果你正在追踪有关内存分配内容的细节,那么你将不得不四处寻找。但作为一个规则拇指,当你使用var,new或声明一个新函数(或闭包)时,你正在吞噬内存。您可以将vars设置为null以标记它们以进行垃圾收集,并且您也可以使用delete关键字,尽管很少有人执行这些操作,除非它们在服务器端(就像我自己使用ASP JScript)那样重要。

答案 3 :(得分:4)

Javascript非常非常友好 - 真的,太友好了一半!

如果你有一个包含3个元素的数组,并且你想要添加第四个元素,那么就可以表现为该数组位置已经存在:

    var arr = ['zero', 'one', 'two'];
    // Now you have arr[0], arr[1] and arr[2].
    // arr.length is equal to 3.
.
    // to add arr[8]:
    arr[8] = 'eight';
    // Now you have arr[0] through arr[8]. arr.length is equal to 9.
    // and arr[3] through arr[7] exist, and 
    // are initialized to undefined. (If I remember right.)

因此,在添加元素时,不需要特别注意内存分配。

答案 4 :(得分:3)

不,你不需要也不能分配内存。 JavaScript解释器会自动执行此操作。

答案 5 :(得分:2)

要回答问题的标题,如果您信任MDN,大多数JavaScript实现都有一堆:

  

对象分配在堆中,这只是一个表示大的对象   主要是非结构化的记忆区域。

多个运行时一起通信

  

Web worker或跨源iframe有自己的堆栈,堆和   消息队列。两个不同的运行时只能通过   通过postMessage方法发送消息。这个方法增加了一个   如果后者监听消息事件,则向另一个运行时发送消息。

为了更深入地了解内存管理,还有一篇文章here,尽管其中大部分都是特定于实现的。

答案 6 :(得分:0)

您无需在Javascript中手动管理内存。堆和堆栈都用于管理内存,它取决于实现。通常,局部变量位于堆栈上,对象位于堆上。