【发布时间】:2019-11-09 07:30:10
【问题描述】:
我在 JavaScript 中遇到了一个奇怪的情况,我正在创建一个对象,然后将其作为参数传递给一个函数,该函数然后更新值,然后返回一个新的更新对象。
function objBuild() {
var obj_old = {}; // original object
var obj_new = {}; // updated object
// set values for original object
obj_old.val01 = "val01_old";
obj_old.val02 = "val02_old";
obj_old.val03 = "val03_old";
// set values for new object using
// the original object as a template
obj_new = objUpdate(obj_old);
console.log(obj_old); // this shows obj_new data which I don't want
console.log(obj_new); // this shows obj_new data which I want
}
function objUpdate(obj) {
obj.val03 = "val03_new";
return obj;
}
我原以为新对象会使用新值更新,但旧对象也会更新。
也许该函数将旧对象作为参考,即使我返回一个单独的值,它也记得它发生了什么?
我不确定,但如果是这种情况,是否可以保持旧对象完好无损?
【问题讨论】:
-
我原以为新对象会用新值更新,但旧对象也会更新。 javascript 中的对象是通过“参考”。从技术上讲,任何非原始值都是(例如,数组具有相同的行为)。您需要先克隆对象并更改克隆的对象值,这不是隐含的,这是设计使然。
-
"即使我返回一个单独的值" - 那会在哪里?不,没有单独的对象。
标签: javascript function scope parameter-passing