控制台诡异录之展开与缩略不一样

问题复现

最近朋友发给我这样的一个串代码:数组

var arr = [1, 4, 2, 3 ];
console.log(arr);
arr.sort();

朋友说,这个输出不正确。我表示不信,就试了下:异步

clipboard.png

从结果看,没毛病啊。朋友说,你展开看看,一看果真有问题spa

clipboard.png

缩略状态的显示与展开的显示不一样!!!code

问题思考

这个问题的表现是:对象

缩略状态下显示原数组 [1, 4, 2, 3 ],展开状态下显示排序后的数组[1, 2, 3, 4 ]排序

这里的不一致致使咱们比较困惑:事件

console.log(arr)打印的数组究竟是原数组仍是排序后的数组?ip

咱们知道的是JS代码是按照顺序执行的,按道理说应该打印[1, 4, 2, 3 ],也就是说缩略状态的显示是符合常理的。经过下面的代码咱们能够佐证:it

var arr = [1, 4, 2, 3 ];
console.log(arr.toString()); // 1,4,2,3
arr.sort();

可是为何展开后的数组倒是排序后的呢?
咱们思考3秒钟
1...
2...
3...
我我的理解这个问题是这样的:
Chrome的展开是一个点击事件,也就是说这是一个异步,等你点击的时候arr.sort()
已经执行完毕了,这时候点击展开arr,其实展开的就是排序后的数组(由于arr是引用类型的)。这样,就出现了上面这个问题。
除数组外,对象也存在这个问题,换句话说,这个引用类型的应该也都存在这个问题。
至此,这个问题算是有了解释。
以上,我的理解,若是你有更好的解释,欢迎提出。console

相关文章
相关标签/搜索