删除对象的属性也会从其他对象中删除类似命名的属性

时间:2017-11-30 17:07:22

标签: javascript

在JavaScript中,如果你这样做

var x = {
    "propname with whitespace": "val1",
    "other propname": "val2"
};

var y = x;

然后执行此操作

delete y["propname with whitespace"];

会导致x失去其propname with whitespace属性。如何在不影响y的情况下从x删除属性,同时仍支持属性名称中的空格?

2 个答案:

答案 0 :(得分:3)

这是因为xy都是对内存中相同值的引用,请参阅this StackOverflow问题。

但是,您可以使用Object.assign()创建对象的浅表副本:



var x = {
    "propname with whitespace": "val1",
    "other propname": "val2"
};

var y = Object.assign({}, x);
delete y["propname with whitespace"];

console.log(y);




答案 1 :(得分:-2)

修改 刚遇到我需要复制和对象的问题,我的解决方案和接受的解决方案都不起作用。这是因为两个解决方案都不能执行深度克隆(当属性值设置为对象时)。请查看此处文档中的警告:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign

深度克隆情况的正确答案是

y = {'a':2,'b':3}
z = JSON.parse(JSON.stringify(y))

这将解决深度克隆问题:例如y = {'a':{'c':4},'b':3}

结束修改

正如Pranav在评论中提到的,两个变量都引用了同一个对象。那么一个人发生了什么,发生在另一个人身上。要解决此问题,您必须创建y的副本,而不引用x:

y = {'a' : 2,'b': 3}
z = Object.keys(y)
let x = {}
z
for (i in z) {
  x[z[i]] = y[z[i]]
}

现在:

delete y["a"]
y = {"b":2}

x = {"a":1, "b":2}

这里最重要的一点是你必须创建一个看起来与y完全相同的新对象,但这并不能引用y。