在JavaScript中,如果你这样做
var x = {
"propname with whitespace": "val1",
"other propname": "val2"
};
var y = x;
然后执行此操作
delete y["propname with whitespace"];
会导致x
失去其propname with whitespace
属性。如何在不影响y
的情况下从x
删除属性,同时仍支持属性名称中的空格?
答案 0 :(得分:3)
这是因为x
和y
都是对内存中相同值的引用,请参阅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。