在setTimeout问题中更新JSON对象

时间:2016-10-13 18:35:06

标签: javascript json

var state = {
  item1 : {
    text : "hi hi"
  }
}

var i = 5;

function test() {
  state.item1.text = i;
  console.log(state)
  i--
  if (i >= 0) {
    setTimeout(test, 1000);
  }
}

test();

有一个非常奇怪的问题,当更新这个json对象时,它没有显示正确的值。任何帮助深表感谢。如果我要控制日志console.log(state.item1),它将打印正确的值。但console.log(state)显示的值不正确。

Codepen示例 http://codepen.io/chrisburgin95/pen/xEzvWz

2 个答案:

答案 0 :(得分:2)

console.log()不存储对象的副本。相反,当您展开嵌套属性时,它将读取每个属性的当前值。

由于您的代码会改变同一个对象,因此在所有超时之后展开已记录的对象会显示最终值。

答案 1 :(得分:2)

Javascript中的对象通过引用传递。当项目打印到控制台时,您将看到对象处于当前状态,而不是打印出来时的状态。如果要在控制台中展开对象,则会看到每个记录项目的state.item1的文本值为0。

这个答案在这个问题上有一些很好的对话:Javascript by reference vs. by value