当实际上没有要添加的值时,将值添加到对象值

时间:2019-04-11 04:11:44

标签: javascript

嗨,我有以下功能

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?有想法吗?我在这里完全迷路了。

1 个答案:

答案 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);

为避免意外更改对象,您必须在执行对象操作之前创建该对象的新实例。有多种方法可以做到这一点:

例如:

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);