Javascript 修改对象';在不创建新对象的情况下单击关键帧

Javascript 修改对象';在不创建新对象的情况下单击关键帧,javascript,jquery,object,Javascript,Jquery,Object,我有以下意见: { foo: 4, bar: 3 } 我想修改此对象的键以获得: { x_foo_y: 4, x_bar_y: 3 } 是否可以在不创建新对象的情况下修改对象?(jQuery可用)您需要添加密钥,然后删除旧密钥 var obj={ 傅:4,, 酒吧:3间 }; obj.x_foo_y=obj.foo; obj.x_bar_y=obj.bar; 删除obj.foo; 删除obj.bar; 警报(JSON.stringify(obj))是的,您只需添加新密钥并删

我有以下意见:

{
  foo: 4,
  bar: 3
}
我想修改此对象的键以获得:

{
  x_foo_y: 4,
  x_bar_y: 3
}

是否可以在不创建新对象的情况下修改对象?(jQuery可用)

您需要添加密钥,然后删除旧密钥

var obj={
傅:4,,
酒吧:3间
};
obj.x_foo_y=obj.foo;
obj.x_bar_y=obj.bar;
删除obj.foo;
删除obj.bar;

警报(JSON.stringify(obj))
是的,您只需添加新密钥并删除旧密钥:

obj.x_foo_y = obj.foo;
delete obj.foo;
obj.x_bar_y = obj.bar;
delete obj.bar;
请注意,在某些发动机(尤其是铬合金V8发动机)上,这将影响对象的性能。如果不需要实际删除属性,可以将它们的值设置为
未定义

obj.x_foo_y = obj.foo;
obj.foo = undefined;
obj.x_bar_y = obj.bar;
obj.bar = undefined;
这不会产生影响(是
delete
使V8将对象置于“dictionary模式”,这比V8的正常编译类模式慢得多)

如果要对对象中的所有“自有”属性执行此操作:

var key;
for (key in obj) {
    if (obj.hasOwnProperty(key)) {
        obj["x" + key + "y"] = obj[key];
        delete obj[key]; // Or obj[key] = undefined if that's okay for your use case
    }
}

literal之后的add属性不会触发“dictionary模式”?可以在循环中执行吗?因为所有键都将获得相同的前缀/后缀。这是一个很好的见解。@user2864740:否,V8的JIT创建了一个具有附加属性的派生类。@Scimonster:对。这就是为什么我说“如果您不需要实际删除属性…”和“…如果您的用例没有问题…”噢!代码片段!我没意识到他们已经上线了。:-)