嗨,我有以下功能
var f = {i:0};
var t=0;
function change(f, t) {
f.i++;
t++;
}
change(f,t);
当我看到控制台日志时,值“ f = {i:1},t = 0”是否可以知道将1加到i而不是t?有想法吗?我在这里完全迷路了。
答案 0 :(得分:2)
这是因为JavaScript对象是通过引用传递的,而标量值是通过值传递的。
因此,当您将对象传递给函数并直接对其进行突变时,实际上是在引用内存中的同一对象。
var f = {
i: 0
};
var t = 0;
function change(f, t) {
f.i++;
t++;
console.log(f, t);
}
change(f, t);
console.log(f, t);
为避免意外更改对象,您必须在执行对象操作之前创建该对象的新实例。有多种方法可以做到这一点:
function({...f}, t)
Object.assign()
f
分配给destructured f
(f = {...f};
)例如:
var f = {
i: 0
};
var t = 0;
function change(f /*{...f}*/, t) {
f = { ...f};
// Or alternatively,
// f = Object.assign({}, f);
f.i++;
t++;
console.log(f, t);
}
change(f, t);
console.log(f, t);
值得注意的是,重新分配对象不会更新该值。请查看Call by sharing。
var f = {
i: 0
};
var t = 0;
function change(f, t) {
f = {i: 1};
t++;
console.log(f, t);
}
change(f, t);
console.log(f, t);