【问题标题】:Strange behaviour with delete [duplicate]删除的奇怪行为[重复]
【发布时间】:2016-07-15 16:05:57
【问题描述】:
var x = {'a': 't1', 'b': 't2', 'c': 't3'};
var y = x;
delete (y['c']);
console.log(x);

预期输出:

Object {a: "t1", b: "t2", c: "t3"}

输出:

Object {a: "t1", b: "t2"}

删除对象 y 的属性会改变对象 x 有什么原因吗?

【问题讨论】:

  • 对象由reference 而不是value 传递。这两个变量都指向相同的内存位置,因此如果它们中的任何一个发生变化,最终都会改变对象..
  • 因为是完全相同的对象实例。
  • @RayonDabre 那么如果我想要一个没有键 c 且不影响对象 x 的对象 y,我该怎么做呢?
  • 您有很多选择可以实现这一目标。只需搜索Deep copy of objects in JavaScript
  • 结账我。我的回答link

标签: javascript


【解决方案1】:

您必须复制该值,默认情况下它采用引用。

Object.assign() 方法用于将所有可枚举自身属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。

脚本:

var x = {'a': 't1', 'b': 't2', 'c': 't3'};
var copy = Object.assign({}, x);
delete (copy.c);
console.log(x);
console.log(copy);

输出:

Object { a: "t1", b: "t2", c: "t3" }
Object { a: "t1", b: "t2" }

fiddle link

【讨论】:

    【解决方案2】:

    当您将一个对象分配给另一个变量时,它只有引用集。因此,操作主对象或分配的变量仍将操作相同的内存位置。因此,您必须将对象深度复制到变量中,这将为变量创建一个新内存,然后对其进行操作。在这里你可以试试这个。

    var y= Object.assign({}, x);
    delete (y['c']);
    console.log(x);
    

    【讨论】:

      【解决方案3】:

      Javascript 总是按值传递,但是当一个变量引用一个对象(包括数组)时,“值”就是对该对象的引用。 所以在你的情况下,你通过引用传递它。

      【讨论】:

        【解决方案4】:

        对象通过引用传递。赋值运算符更改引用,而不是值。

        这在大多数编程语言中很常见,如果您不想修改x,则需要制作对象的深层副本。你可以see这个话题。

        【讨论】:

          猜你喜欢
          • 2014-03-08
          • 1970-01-01
          • 1970-01-01
          • 2018-07-27
          • 2013-06-28
          • 2015-07-26
          • 2020-04-26
          • 2015-08-17
          • 1970-01-01
          相关资源
          最近更新 更多