关于先console再改变对象内容的问题

先看代码结构:

 console.log("历史消息res",res)
     
      for (let i = 0; i < res.result.length; i++) {
   
        let theData = JSON.parse(res.result[i].payload);
        theData.sendTime = res.result[i].ms;
        console.log(`每个历史消息${i}`,theData)

        theData.sendHour = formatTimestamp(theData.sendTime).hour;
        theData.sendMinute = formatTimestamp(theData.sendTime).minute;

      }

数组结构:
关于先console再改变对象内容的问题_第1张图片
数组内的对象结构:

{
    "msg":"222222",
    "avatar":"[https://hqjynanj.oss-cn-shenzhen.aliyuncs.com/web/skylive/images/live_user1.png](https://hqjynanj.oss-cn-shenzhen.aliyuncs.com/web/skylive/images/live_user1.png)",
    "role":2,
    "msgType":0,
    "sendTime":1603942259000,
    "uid":"1010561896",
    "nickName":"23123"
}

输出:
关于先console再改变对象内容的问题_第2张图片

这里的逻辑可以看到,原本是想先输出theData再对theData加sendHour和sendMinute属性,但是发现这两个属性被提前加到了console的theData对象里。

这是为什么呢?

我想大概是这个原因,因为js看到你console这个对象,但后面又对这个对象进行了操作,所以会等你操作完再输出这个对象,这就导致了输出的结果和自己想象的不一样。可以加debugger,然后鼠标悬浮上去看实时的数据内容。

如果想临时输出这个theData对象,可以这么做,先转为字符串再转为对象输出,类似深拷贝的思想。这样程序执行到这里,就会立刻输出。

 console.log(`每个历史消息${i}`,JSON.parse(JSON.stringify(theData)))

关于先console再改变对象内容的问题_第3张图片

你可能感兴趣的