JavaScript新关键字和内存管理

Kon*_*rad 21 javascript garbage-collection memory-management

来自C++,每当我打电话给new我的电话时,我都会感到难以理解delete.在JavaScript中,我发现自己new偶尔在我的代码中调用,但是(希望)浏览器中的垃圾收集功能将为我处理混乱.

我不喜欢这个 - delete在JavaScript中有一个方法,我是如何使用它与C++不同的?

谢谢.

MBO*_*MBO 24

var component = new Component();
component = null; // delete this at next garbage collection
Run Code Online (Sandbox Code Playgroud)

  • 对于那些不习惯GC的人来说,这表达了**删除的**相反的含义.对他们来说,似乎意图是永远分配内存,所以我想它并不能提供提问者似乎正在寻找的"安慰".然后,如果他只是在寻找一种方式来传达不再需要该对象的意图(为了便于阅读),这就成功了. (2认同)
  • 如果未分配给变量,这如何工作。例如:`new Component().init();` 性能后果是什么? (2认同)

mor*_*des 13

顺便说一下,"new"关键字在javascript中并不是必需的,并且没有(直接)与分配内存有关.所有"new"都会传递一个名为"this"(this = {})的新空对象作为函数的隐藏参数.

var MyClass = function(){
    // fresh empty object "this" gets passed to function
    // when you use the "new" keyword 
    this.method = function(){}
}

var myInstance = new MyClass();
Run Code Online (Sandbox Code Playgroud)

Javascript可以通过嵌套闭包和多个"this"变量在不同的范围内浮动而变得有点毛茸茸.我更喜欢这样做:

var MyNoNewClass = function(){
    // I find this more explicit and less confusing
    var self = {}
    self.method = function(){}
    return self;
}

var myNoNewInstance = MyNoNewClass()
Run Code Online (Sandbox Code Playgroud)


Bob*_*Bob 5

引用了所有JavaScript内存,但不是传统意义上的.内存不是由内存地址引用,而是由字符串引用.在这段代码中:

var x = new someObj();
Run Code Online (Sandbox Code Playgroud)

从该点开始,该对象由字符串"x"引用.x不是指向堆上某些内存的指针.如果你分配了xa属性,那么:

x.someProp = 42;
Run Code Online (Sandbox Code Playgroud)

然后someProp是内存中引用值42的字符串.因此,它允许您使用数组表示法通过它的字符串表示来访问它:

x["someProp"]++;
Run Code Online (Sandbox Code Playgroud)

这也是变量可以保持任何值的原因,因为它们不需要大小.

当没有更多的字符串(也就是变量或属性名称)引用它时,内存是用JavaScript收集的.当x被赋予任何其他值时,将收集该对象.您可以将其设置为null,undefined或其他任何内容,并将收集内存.

也就是说,当浏览器或任何JavaScript引擎转向它时,它将被收集.

删除仅从对象中删除属性.从那时起,试图访问该属性将返回undefined.在大多数情况下,以下两行代码是等效的:

x["someProp"] = undefined;
delete x.someProp;
Run Code Online (Sandbox Code Playgroud)

编辑:好的,内部两条线不一样.删除操作符将从内存中删除"someProp"引用,而将其设置为undefined则不会.我认为.我在规范中找不到任何关于将变量或属性设置为undefined的内容,但我不认为这样做有什么特别之处.

需要注意的重要一点是,您将无法删除具有某个标志集的属性,但您可以将它们设置为null或undefined(如果它们没有被setter包装,甚至允许这种情况发生).