不使用循環,如何建立一個長度爲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個字符,而後獲取索引,好比說用二進制等等,奇淫巧技數不勝數,這裏就不一一贅述了!

我以爲一個話題或者說一個命題,可以牽扯出別的知識點,學習到更多的技巧,那這個命題就是有價值的,也是有意義的,不想多說了,一張圖結束今天的話題!

若是你以爲你那裏有什麼好的實現方式,也能夠在評論中發出來給你們參考一下!

原創不易,歡迎轉載,轉載時請註明出處,謝謝!

相關文章
相關標籤/搜索