【问题标题】:Delete property in referenced JS object删除引用的 JS 对象中的属性
【发布时间】:2018-09-10 20:20:40
【问题描述】:

假设我想删除 JS 对象中的一个属性

const source = {
  nestA: {
    nestB: {
      nestC: 'deleteMe'
    }
  }
}
const clone = {}
clone.nestA = {...source}.nestA
delete clone.nestA.nestB
console.log(source)

执行以上脚本
期望:source 保持不变
实际:source 将变为 {}

但是,如果我只做delete clone.nestAsource 将保持不变

问题:delete clone.nestA.nestB 怎么会影响source。但是delete clone.nestA 没有?

【问题讨论】:

  • {...source}.nestA 没有意义,你可以(应该)只使用source.nestA
  • 展开语法赋值不会进行深拷贝。
  • 您的问题是什么?你明白为什么会这样吗?
  • 在 Windows 10 上的版本 69.0.3497.81(官方版本)(64 位)中,source{ nestA: {} },而不是 {}

标签: javascript ecmascript-6 babeljs


【解决方案1】:

为什么delete clone.nestA.nestB 会影响source,而delete clone.nestA 不会?

sourceclone 是不同的对象。从source.nestA 属性和clone.nestA 属性都引用了第三个对象。 (另一个对象在它的 nestB 属性上)。

当您删除source 上的属性时,例如source.nestA 属性,您只会影响source 对象。

当您删除第三个对象上的属性时,例如source.nestA.nestBclone.nestA.nestB(这是同一对象上的同一属性),您只会影响第三个对象。只是sourceclone 现在都引用了缺少属性的对象。

【讨论】:

    【解决方案2】:

    您可以使用对象的分配方法来创建深层副本,这样您的源就无法触及。

    let deepCopy = Object.assign({},source);
    // do anything with deepCopy.
    

    更新 - 它不会创建嵌套对象的深层副本。您可以使用以下方法为嵌套对象创建深层副本。

    让 deepCopy = JSON.parse(JSON.stringify(source));

    或者

    function cloneObject(obj) {
    var clone = {};
    for(var i in obj) {
        if(obj[i] != null &&  typeof(obj[i])=="object")
            clone[i] = cloneObject(obj[i]);
        else
            clone[i] = obj[i];
    }
    return clone;
    }
    

    检查

    【讨论】:

    • 据我所见并非如此。如果您运行它,它的行为方式与传播示例相同:const source = { nestA: { nestB: { nestC: 'deleteMe' } } }; const clone = Object.assign({}, source); delete clone.nestA.nestB; console.log(source);
    猜你喜欢
    • 2011-06-30
    • 1970-01-01
    • 2021-09-11
    • 1970-01-01
    • 1970-01-01
    • 2021-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多