摘要:问题复现最近朋友发给我这样的一个串代码朋友说,这个输出不正确。我表示不信,就试了下从结果看,没毛病啊。朋友说,你展开看看,一看果然有问题缩略状态的显示与展开的显示不同问题思考这个问题的表现是缩略状态下显示原数组,展开状态下显示排序后的数组。
问题复现
最近朋友发给我这样的一个串代码:
var arr = [1, 4, 2, 3 ]; console.log(arr); arr.sort();
朋友说,这个输出不正确。我表示不信,就试了下:
从结果看,没毛病啊。朋友说,你展开看看,一看果然有问题
缩略状态的显示与展开的显示不同!!!
问题思考这个问题的表现是:
缩略状态下显示原数组 [1, 4, 2, 3 ],展开状态下显示排序后的数组[1, 2, 3, 4 ]。
这里的不一致导致我们比较困惑:
console.log(arr)打印的数组到底是原数组还是排序后的数组?
我们知道的是JS代码是按照顺序执行的,按道理说应该打印[1, 4, 2, 3 ],也就是说缩略状态的显示是符合常理的。通过下面的代码我们可以佐证:
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是引用类型的)。这样,就出现了上面这个问题。
除数组外,对象也存在这个问题,换句话说,这个引用类型的应该也都存在这个问题。
至此,这个问题算是有了解释。
以上,个人理解,如果你有更好的解释,欢迎提出。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/89357.html
摘要:一个诡异的结果在前端开发中,我们都少不了用来输出变量和调试。再看下面一个例子图中的结果,我是在执行了这句话之后才点击的小三角,然而结果却没有变成诡异结果的样子。 一个诡异的结果 在前端开发中,我们都少不了用console.log来输出变量和调试。可是在使用它的过程中,偶尔也会出现一些让我们很费解的行为,如下图: showImg(https://segmentfault.com/img/...
摘要:函数柯里化关于函数柯里化的问题最初是在忍者秘籍中讲闭包的部分中看到的,相信很多同学见过这样一道和柯里化有关的面试题实现一个函数,使得如下断言能够能够通过简单说就是实现一个求值函数,能够将所有参数相加得出结果。方法返回一个表示该对象的字符串。 函数柯里化 关于函数柯里化的问题最初是在《JavaScript忍者秘籍》中讲闭包的部分中看到的,相信很多同学见过这样一道和柯里化有关的面试题:...
摘要:对于通常的特别是那些具备并行计算多线程背景知识的来讲,的异步处理着实称得上诡异。而这个诡异从结果上讲,是由的单线程这个特性所导致的。的特性之一是单线程,也即是从头到尾,都在同一根线程下运行。而这两者的不同,便在于单线程和多线程上。 对于通常的developer(特别是那些具备并行计算/多线程背景知识的developer)来讲,js的异步处理着实称得上诡异。而这个诡异从结果上讲,是由js...
阅读 1922·2021-10-11 10:59
阅读 1032·2021-09-07 09:59
阅读 2225·2021-08-27 16:17
阅读 2782·2019-08-30 15:54
阅读 2273·2019-08-30 12:58
阅读 1772·2019-08-30 12:53
阅读 1463·2019-08-28 18:13
阅读 731·2019-08-26 13:35