换句话说,我有什么选择在JavaScript中分配内存?
我知道你可以全局或在函数范围内分配内存。我可以动态分配内存吗? new
运算符到底意味着什么?
编辑:这是一个具体的例子。您将如何实现从用户读取整数值 - n
,然后将n
整数读入数组?
答案 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)
如果你正在追踪有关内存分配内容的细节,那么你将不得不四处寻找。但作为一个规则拇指,当你使用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中手动管理内存。堆和堆栈都用于管理内存,它取决于实现。通常,局部变量位于堆栈上,对象位于堆上。