今天调试的时候遇到一个困惑的问题,
let a = [{age:18}]
console.log(a)
a[0].age = 20
将这段代码复制到chrome控制台运行时,输出结果是 [{age:20}]
,但是按照执行顺序,结果应该是 [{age:18}]
才对。
![](https://img.haomeiwen.com/i3619404/cba067751f5a534e.png)
在node环境下跑了下,结果却是正常的!看来问题出在chrome控制台。
![](https://img.haomeiwen.com/i3619404/ca5ac17da41d8653.png)
原因分析
-
js里对象是引用类型,会公用内存。
-
chrome的console.log不会把复杂对象立即输出,点击展开时才会去内存中读取对象的属性值,此时内存中对象的属性已经被修改了,所以看到的是修改后的值
结论
通过console.log
输出基本类型时是可信的,但对于引用类型是不一定的,通过JSON.stringify
可以解决。
在node
环境里,console.log()
是同步的,不会有这种问题出现。
网友评论