例
假设你需要生成一个从0到99的数组。你要怎么做呢?下面是一种解法:
const arr=[]; for (let i=0; i < 100; i++) { arr[i]=i; }
如果你和我一样,看到这种使用传统的for循环的方式会有点不大习惯了。事实上,我已经好多年不使用for循环写代码了。毕竟,各种高阶函数,像forEach, map, filter, reduce足以让我写出各种漂亮的代码。
也许你还没有沉醉于函数式编程的美妙,那么你会认为上面的解法足矣。不过,如果你用过高阶函数编程,你也许就会想:一定还有更加优雅的实现方法。
我的第一直觉就是:首选创建一个长度为100的空数组,然后由map用index去初始化每一个元素。在JavaScript中,你可以用Array构造函数来创建数组:
const arr=Array(100);
接下来你只需要用map就可以解决问题了:
const arr=Array(100).map((_, i)=> i); console.log(arr[0]===undefined); // true
可是,为什么第一个元素不是0而是undefined?
解释
为了理解为何没有生效,我需要首先讲清楚一个非常重要的技术点。在内部,JavaScript数组实际上是对象,对象里面的属性名是数字,对应数组的下标。举个例子:
['a', 'b', 'c']
它实际上等价于:
{ 0: 'a', 1: 'b', 2: 'c', length: 3 }
当你去访问数组的第0个元素的时候,实际上访问的是对象中属性名为0的元素。接下来我们会解释为何刚刚的代码没有效果。
当你使用Array构造函数来新建一个数组,那么它会创建一个新的数组对象,并且将长度length设定为指定的值。但是,对象里面没有数组索引:
{ //no index keys! length: 100 }
当你去访问数组的第0个元素的时候,返回值为undefined。但并不是指第0个元素得值为undefined,而是当数组下标不存在的时候,默认的返回值。
并且如果数组下标不存在的话,其实map函数并没有真正的对每一个元素执行操作。因为只有当下标存在的时候,map的回调函数才会执行。
解法
因此,我们只需要在数组对象中构造出数组的下标就可以了。最好的方法就是用展开运算符:
const arr=[...Array(100)].map((_, i)=> i); console.log(arr[0]); // 0
使用展开运算符后的数组对象:
{ 0: undefined, 1: undefined, 2: undefined, ... 99: undefined, length: 100 }
就可以顺利使用map函数了。
关于Fundebug
Fundebug专注于JavaScript、微信小程序、小游戏BUG监控,自从2016年双十一正式上线,Fundebug已经服务了一年半时间,累计处理了5亿+错误事件,得到了众多知名用户的认可。Fundebug支持主流前端框架的bug监控,欢迎各位老铁体验!
补充一个方法:
Array.from({length: 100}, (_, i)=> i);
解决。
上热搜!
百度地图崩了!
今天下午
不少网友表示
百度地图突然出现定位错误
自驾路线无法正常规划等问题
甚至有人吐槽
“找不到回家的路”
对此
百度地图表示
“您反馈的问题
已经加速修复中
各地区服务在逐步恢复中”
你手机上的百度地图
还能使用吗?
遇到这种导航失灵的情况
你又是怎么做的呢?
综合自微博、小红书
来源: 新闻110
灵的高德导航让人气愤。
从松山纪念馆出来就进入了这种小石子路,好难走,20公里时速走的慢慢的。因为高德地图能设置车的宽度和高度,所以开房车以后就改用了高德地图。也不知道高德地图怎么导航的,导了这样的一条烂路,还说是最佳路线。
在广州的时候也试过两三次,带我们走一些很小很小的路,左绕右绕,绕了好久,到了以后才知道原来就是一条很好走的大路。带我们绕了半天,开了一个多差不多两个小时才走了五六十公里,终于可以上高速了。
一上高速碰到检查站,设置的是高速路线,结果走了100多公里,要让我们下高速了。导航路线显示高速就在前面,但是走来走去怎么也上不回高速。走了200多公里,山路和国道跨过了整个大理古城,终于在晚上9点多上到高速了。
一上高速,第一个服务区就停车做吃的了。今天一起从松山出发的车友也遇到了导航失灵,晚上就在这个服务区驻车。早上吃完饭就往白沙镇出发,中午终于到了白沙镇。
*请认真填写需求信息,我们会在24小时内与您取得联系。