先看一段代码
1 | let f = []; |
你可以想象一下输出结果是什么?
nodejs 版本为8.0.0在终端输出的结果为:
1 | { a: 1, b: 2 } |
你可以把上面的代码粘贴到chrome里面的console控制台里面,按回车键执行,会得到下面的结果:
nodejs是基于chrome V8 引擎开发的js解析环境,所以理论上nodejs和chrome浏览器里面的js引擎是同一款,
那么输出的结果也应该是一样的。然后实践出真知,以上的结果出乎我的意料。有人说是因为闭包,作用域等等理论,
也有人说是因为io读写的原因刚刚开始我也以为是这种原因,就胡乱测试。经过一天的思考和资料查阅,
发现一开始的方向就错了。最后得出的结论是:这是由于chrome浏览器存在bug引起的。证明如下:
我在俩个输出语句中打了断点,按F10每次一打印出来,我就用鼠标点开,查看Object的值,可以发现这里的值和
nodejs中输出是一致的。 下面看另一种图:
我同样在俩个输出语句中打了断点,按F10每一次打印出来,我先不用鼠标点开。等到跳过了所有断点,我再点开每一个
Object值,结果同浏览器输出的结果一样。
结论(猜测)
由于是黑盒测试,所以是猜测:chrome浏览器可能为了方便处理开发者工具里面的console,在用户没有点开Object值之前,是不会渲染Object
内存里面的值。等用户真正点开的时候,console才会渲染Object所在内存的值。所以在我们打断点的时候,每执行一次,点开查看Object就会
出现和nodejs一样的值;而另外一种情况,等到都执行完再点开查看Object就会看到最后内存中的值。
可能解释的不是很清楚。自己亲手做一遍就知道了。
PS!!!!!!
最近还有很多有关js、css、react、nodejs等需要总结的东西。还有react各种组件的封装,也想实现一遍哇。还有几个开源项目也只做了一个开头,
还得继续抽时间写哇。周末不看动漫了,(:,好好写代码!!!(最近有好几部喜欢看的新番,怎么能不看呢,23333,周末还要去游泳,代码随它去吧。