【问题标题】:JavaScript weird behavior when object deleted删除对象时的 JavaScript 奇怪行为
【发布时间】:2017-11-20 15:18:26
【问题描述】:

我做了以下事情:

a = {a:1};
b = {b:1};

c = [a,b]

delete a;

现在我不明白为什么 c 仍然有两个对象:[a, b] 但是当我尝试打印时,控制台给了我: Uncaught ReferenceError: a is not defined

似乎对象不再存在,但它仍然存在于数组中。

我也试过打印:

typeof a //"undefined"

typeof c[0] //"object"

我确信当将一个对象分配给一个变量时,它是通过引用分配的。好像这里的对象被复制了?

【问题讨论】:

标签: javascript object variable-assignment


【解决方案1】:

delete 运算符从对象中删除属性。

也就是说,如果你有一个对象const obj = { a: 56, b: 62 }并且你执行delete obj.b,那么b属性将被移除并且对象只会是{ a: 56 }

由于您没有声明任何变量,因此您正在隐式处理窗口对象。你的代码相当于:

window.a = {a:1};
window.b = {b:1};

window.c = [window.a, window.b]

delete window.a;

如您所见,您刚刚向window 对象添加了一些属性,然后删除了其中一个。但是,您没有删除分配给该属性的对象。

JavaScript 中的任何对象都将被保留,直到不再引用每个对象。在这里,分配给window.c 的数组中仍然有一个对您希望删除的对象的引用,并且该对象没有被销毁。 (想一想:如果对象已被删除,您希望数组中的内容是什么?)

【讨论】:

    【解决方案2】:

    与普遍认为的不同,删除操作符没有什么可做的 直接释放内存。内存管理是间接完成的 通过中断引用,请参阅内存管理页面了解更多信息 详情。

    阅读here

    即使您删除了aa 的引用也会存储在c 中。

    因此c 将始终为object 类型。

    a = {a:1};
    b = {b:1};
    
    c = [a,b];
    
    delete a;
    
    console.log(c);

    上面的代码会返回:

    [
      {
        "a": 1
      },
      {
        "b": 1
      }
    ]
    

    但如果你删除delete c[0].a,那么它会从数组c 中删除a

    a = {a:1};
    b = {b:1};
    c = [a,b];
    console.log (delete c[0].a);
    console.log(c);

    输出将是:

    [
      {},
      {
        "b": 1
      }
    ]
    

    【讨论】:

    • c 不存储a 的副本,而是对a 的引用。
    • @str 是的,用词不当。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-13
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 2018-12-16
    • 1970-01-01
    相关资源
    最近更新 更多