删除时出现奇怪的行为

时间:2016-03-28 11:44:29

标签: javascript

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?

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

这在大多数编程语言中都很常见,如果您不想修改x,则需要对该对象进行深层复制。你可以see这个帖子。

答案 2 :(得分:1)

将对象分配给另一个变量时,它只是参考集。因此,操纵主对象或指定的变量仍然会操纵相同的内存位置。因此,您必须将对象的深层副本复制到变量中,这将为变量创建新内存,然后对其进行操作。在这里你可以试试这个。

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

答案 3 :(得分: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