不使用循环,如何建立一个长度为100的数组

前言:

问题描述:在不使用循环的条件下,如何建立一个长度为100的数组,而且数组的每个元素是该元素的下标?前端

这是一个比较经典的前端面试题,也能够当笔试题,咋一看,好像难度不大,实际上考察的知识点还很多,值得写篇文章来备忘!废话很少说,直接进入正文!es6

正文

为了理解这道题的意思,咱们先用传统的方法来实现一下:面试

使用for方法:api

  var arr = new Array(100); for(var i=0;i<arr.length;i++){ arr[i] = i; } console.log(arr);

 

 或者是:数组

  var arr = new Array(); for(var i=0;i<100;i++){ arr.push(i); } console.log(arr);

 

能够获得一个0-99的数组,使用while,do while也能够实现,这里就不写了,那不用循环,怎么获得呢?app

第一种:Object.keys()学习

  var arr = Object.keys(Array.apply(null, {length:100}))   console.log(arr);

 

这里经过Array.apply(null, {length:100})建立一个长度为100的数组,尽管里面的值为undefined,而后咱们使用Object.keys()方法获取数组的key值,那这里就能够get到Object.keys()方法的新技能了,你还不知道,去查查吧!spa

可是这里获得的数组是一个字符串数组,不是数字,因此咱们须要再加工一下,字符串转数字的方法就不少了,这里用map()方法:code

  var arr = Object.keys(Array.apply(null, {length:100})).map(function(item){ return +item; }); console.log(arr);

 

+号是一个转换格式的小技巧,你也能够使用parseInt对象

第二种:Array.from()

  var arr = Array.from({length:100}, (v,k) => k); console.log(arr);

 

这里使用的Array.from()方法,从类数组或可迭代的对象建立一个新数组,你不懂用法,去查查吧!

第三种:Array.keys()

  var arr = new Array(100).keys(); console.log(Array.from(arr));

 

这里主要使用Array.keys()方法,获取数组的key值

第四种:Object.keys() 与 Array.from()

  var arr = Object.keys(Array.from({length:100})); console.log(arr);

这种方式建立的也是一个字符串数组,因此须要转一下,方式跟第一种同样

  var arr = Object.keys(Array.from({length:100})).map(function(item){ return +item; }); console.log(arr);

 

实现原理大体说一下,先用Array.from获得一个100值为undefined的数组,而后获取数组的key值,最终返回一个数组,不明白的能够仔细领会一下第二种和第三种

第5种:使用...扩展运算符

var arr = [...Array(100).keys()]; console.log(arr);

 

或者能够改写成:

var arr = [...Array.from({length:100}).keys()]; console.log(arr);

 

不熟悉扩展运算符的能够去es6教程里面看一下,这里就不介绍了

第6种:使用String()方法,比较特别

var arr = Object.keys(String(Array(101))); console.log(arr);

 

这里须要用101位,为何?由于在建立一个100个值的数组的时候,由于是空值数组,在将数组转成字符串的时候,其实是存的空值之间的逗号(,),2个值才有一个逗号,3个值有2个逗号,以此类推,100个值须要101位,而后用Object.keys()

方法转成数组,弄懂前面的方法的应该知道,此时的数组是一个字符串数组,因此还须要安装方法一处理一下:

var arr = Object.keys(String(Array(100))).map(function(item){ return +item; }); console.log(arr);

 

第7种:使用Int8Array(),比较偏门

var arr = Object.keys(new Int8Array(100)).map(function(item){ return +item; }); console.log(arr);

 

须要了解原理的同窗,建议看一下Int8Array()的api

第8种:setInterval方法,感受更偏门了

  var arr = []; var i = 0; var timer = setInterval(function(){ arr[i] = i++; if(i>=100){ clearInterval(timer); console.log(arr); } },1);

 

经过定时器的思路,给数组赋值,确实很妙

第9种:受定时器启发,能够用递归调用

  var arr = []; var i = 0; function MakeArray(num){ if(i<num){ arr[i] = i++; MakeArray(num); } return arr; } console.log(MakeArray(100));

 

第10种:能够使用第七种的变种,请看:

  var arr = new Array(100).toString().split(',').map(function(item,index){ return index; }); console.log(arr);

 

我以为这个知识点给出10种方法,应该差很少了,可是方法远远不止这10种,好比说截取网页中的100个字符,而后获取索引,好比说用二进制等等,奇淫巧技数不胜数,这里就不一一赘述了!

我以为一个话题或者说一个命题,可以牵扯出别的知识点,学习到更多的技巧,那这个命题就是有价值的,也是有意义的,不想多说了,一张图结束今天的话题!

若是你以为你那里有什么好的实现方式,也能够在评论中发出来给你们参考一下!

原创不易,欢迎转载,转载时请注明出处,谢谢!

相关文章
相关标签/搜索