换句话说,我在JavaScript中有哪些选项可以分配内存?
我知道你可以在全局范围或函数作用域内分配内存。我能动态地分配内存吗? new
操作符到底是什么意思?
编辑:这里有一个具体的例子。您如何实现从用户读取整数值 - n
,然后读取n
个整数到数组中?
换句话说,我在JavaScript中有哪些选项可以分配内存?
我知道你可以在全局范围或函数作用域内分配内存。我能动态地分配内存吗? new
操作符到底是什么意思?
编辑:这里有一个具体的例子。您如何实现从用户读取整数值 - n
,然后读取n
个整数到数组中?
你不能分配内存。你可以创建对象。这就是new
的作用。
现在,JavaScript是一个奇怪的生物:在JavaScript中,函数也是对象。这意味着你可以使用new
实例化几乎所有东西。
因此,new
操作符表示正在创建一个新对象。
Javascript也会像Java一样垃圾回收这些变量,如果你了解Java,那么很容易就能看到它们之间的相似之处。
祝好!
jrh
PS:当你分配对象时,你确实在分配内存。只是你没有显式地做这件事。你可以分配一个数组,并使它像一个内存缓冲区,但这将严重降低JavaScript的性能:JavaScript数组不是内存缓冲区,它们也是对象(像其他所有东西一样)。
JavaScript有垃圾回收机制,会自动处理这个问题。
然而,在适当的情况下,您可以使用delete
运算符来帮助它。
就像您使用new运算符创建对象一样,当您完成对它们的使用时,应该删除对象,如下所示:
delete myObjectVariable;
JavaScript运行时在将对象的值设置为null时自动进行垃圾回收。但是,将对象设置为null并不会从内存中删除引用对象的变量。使用delete可以确保回收除对象本身使用的内存之外的此内存。(如果您显式调用delete,还可以更轻松地看到分配和释放不平衡的位置。)
史蒂夫
听起来你是从注重内存的编程语言转换到JS,试图将那种逻辑强行套入JS中。是的,JS也会使用内存(当然),但我们有垃圾回收机制来处理清理所有内容。
如果您想了解有关内存分配细节的具体信息,则必须搜索相关内容。但通常情况下,当您使用var、new或声明新函数(或闭包)时,都会占用内存。您可以将变量设置为null以标记它们进行垃圾回收,也可以使用delete关键字,尽管很少有人这样做,除非他们在服务器端工作(如我使用ASP JScript),这是非常重要的。
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.)
不需要也无法分配内存。JavaScript解释器会自动完成这个过程。
var
用于什么以及为什么应该使用它? - Gumbo在Javascript中,您不需要手动管理内存。堆和栈都在底层用于管理内存,这取决于实现方式。通常,局部变量在栈上,对象在堆上。
.push()
将值推入数组中。然后使用const n = read()
和const arr = []; for (let i = 0; i < n; i += 1) { arr.push(read()) }
。在JS中,“数组”在内存意识语言中被称为“向量”。 - Félix Saparellinull
、undefined
、true
和false
,虽然是原始类型,但实际上是在堆上分配的。这个答案https://dev59.com/P2w15IYBdhLWcg3wcrdC#6604390有更多细节。对于普通的JS程序员来说,这更像是实现细节。 - xji