【问题标题】:How 'Delete' works in javascript? [duplicate]javascript中的“删除”如何工作? [复制]
【发布时间】:2018-05-06 23:06:14
【问题描述】:

我对 js 的“删除”运算符有点困惑。

例如

var data = { 
   list : [a, b, c]
}
var temp = data;

console.log(temp.list[2]); //Result 'c'
console.log(data.list[2]); //Result 'c'

delete temp.list[2];

console.log(temp.list[2]); //Result undefined
console.log(data.list[2]); //Result undefined why?

在这种情况下, 我刚刚删除了temp.list[2],但data.list[2] 也显示未定义。

'delete' 操作符是否跟踪数组地址并删除其中的数据? 这就是为什么data.list[2] 也未定义? (因为data.list[2] 有地址,而不是实际数据本身) 我认为有解释。你能帮帮我吗?

【问题讨论】:

标签: javascript arrays object memory


【解决方案1】:

查看其他人发布的所有优秀参考资料。但为了快速解决问题,请使用 ES6 扩展运算符创建一个副本。

    var data = { 
    list : ["a", "b", "c"]
    }
    var temp = {...data};  // this is now a copy not a reference

More on the spread operator

换句话说,这不是删除问题,而是参考与复制问题

【讨论】:

  • 这是对价差运算符的最荒谬的滥用...投赞成票!
【解决方案2】:

JS 中的复杂类型是通过引用传递的,除非你明确地负责复制它们。

这里发生的事情是:

var data = {        // <--\
   list : [a, b, c] // <----------------------------------------------
}                   // <--/                                           |
var temp = data;  // this is NOT a copy, but literally a pointer to -/

试试

var temp = Object.assign({}, data);

如果你想要一个副本。

【讨论】:

    【解决方案3】:

    您的问题涉及多个主题:

    首先,delete 运算符从对象中删除给定的属性,但是当用于从数组中删除元素时,数组长度不受影响:

    let trees = ['redwood', 'bay', 'cedar', 'oak', 'maple'];
    delete trees[3];
    alert(trees.length); //shows 5
    

    如果这不是您想要的,请考虑改用splice 方法。它真的很强大,不仅可以用来删除元素。

    let trees = ['redwood', 'bay', 'cedar', 'oak', 'maple'];
    trees.splice(3, 1);
    alert(trees.length); //shows 4
    

    其次,正如大家已经提到的,var temp = data; 不会创建对象的副本,它只是复制引用。要对您的对象进行完全相同的浅层克隆,您可以编写:

    let clone = Object.create(Object.getPrototypeOf(obj), 
        Object.getOwnPropertyDescriptors(obj));
    

    此调用对 obj 进行了真正精确的复制,包括所有属性:可枚举和不可枚举、数据属性和 setter/getter – 一切,以及正确的 [[Prototype]],当 Object.assign() 方法只复制可枚举和拥有时从源对象到目标对象的属性

    【讨论】:

      【解决方案4】:

      引用类型

      var data = [] ==> instance
      var temp = data; ==> data reference
      
      get temp ==> return data
      
      // shallow copy !!! 
      var temp = Object.assign([], data); ===> instance
      
      
      
      console.log(temp.list[2]); //Result undefined
      
      console.log(data.list[2]); //Result c
      

      https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign

      【讨论】:

        猜你喜欢
        • 2011-07-21
        • 1970-01-01
        • 1970-01-01
        • 2014-05-30
        • 2016-02-28
        • 2012-12-07
        • 1970-01-01
        • 2013-09-26
        相关资源
        最近更新 更多