代码之家  ›  专栏  ›  技术社区  ›  Yuval Adam

javascript有内存堆吗?

  •  22
  • Yuval Adam  · 技术社区  · 15 年前

    换句话说,我必须在javascript中分配内存的哪些选项?

    我知道您可以全局分配内存,也可以在函数范围内分配内存。我可以动态分配内存吗?什么是 new 接线员真的是什么意思?

    编辑: 下面是一个具体的例子。如何实现从用户读取整数值- n 然后读 n 整型数组?

    7 回复  |  直到 7 年前
        1
  •  24
  •   jrharshath    15 年前

    您无法分配内存。可以创建对象。就是这样 new 做。

    现在,javascript是一个奇怪的生物:函数也是javascript中的对象。所以这意味着你可以用 新的 .

    所以, 新的 运算符表示正在创建新对象。

    JavaScript也会垃圾收集这些变量,就像Java中发生的一样。因此,如果你知道Java,你应该很容易画出相似之处。

    干杯,

    JRH

    PS:当您分配对象时,实际上是在分配内存。只是,你没有明确地这么做。您可以分配一个数组,使其行为类似于内存缓冲区,但这会严重降低JavaScript的性能:JavaScript数组不在内存缓冲区中,它们也是对象(与其他所有对象一样)。

        2
  •  7
  •   Steve Harrison    15 年前

    javascript有垃圾收集,并为您处理这些垃圾。

    但是,您可以使用 delete 适当情况下的操作员。

    Apple JavaScript Coding Guidelines :

    就像你用新接线员 创建一个对象,您应该删除 完成后的对象 他们,像这样:

    delete myObjectVariable;

    javascript运行时自动 垃圾收集对象时 值设置为空。但是,设置 对象为空时不会删除 引用对象的变量 从记忆中。使用“删除”可确保 这个内存是另外回收的 对象使用的内存 本身。(也更容易看到 分配和 如果您 显式调用delete。)

    史蒂夫

        3
  •  4
  •   Pete Duncanson    15 年前

    嗯,对我来说,听起来就像你来自于以记忆为中心的语言,并试图将这种逻辑引入JS。是的,JS使用内存(当然),但是我们有垃圾收集来处理所有的问题。

    如果你想了解内存分配的细节,那么你必须四处寻找。但一般来说,当您使用var、new或声明一个新函数(或闭包)时,会占用内存。您可以将vars设置为空以将其标记为垃圾收集,也可以使用delete关键字,尽管很少有人会这样做,除非它们在服务器端(像我自己使用的ASP JScript)工作,这一点很重要。

        4
  •  4
  •   Brian Wren    10 年前

    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.)
    

    因此,在添加元素时,对内存分配非常具体是不必要的。

        5
  •  3
  •   Gumbo    15 年前

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

        6
  •  2
  •   cchamberlain    7 年前

    回答问题的题目,如果你要相信 MDN 大多数javascript实现都有一个堆:

    对象在堆中分配,堆只是一个名称,用于表示 大部分是非结构化的内存区域。

    几个运行时在一起通信

    Web工作者或跨源iframe有自己的堆栈、堆和 消息队列。两个不同的运行时只能通过 通过postmessage方法发送消息。此方法添加 如果后者监听消息事件,则发送消息给另一个运行时。

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

        7
  •  0
  •   Sudesh Banskota    7 年前

    您不需要在JavaScript中手动管理内存。堆和堆栈都在引擎盖下用于管理内存,这取决于实现。通常,局部变量在堆栈上,对象在堆上。