問題描述:在不使用循環的條件下,如何建立一個長度爲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個字符,而後獲取索引,好比說用二進制等等,奇淫巧技數不勝數,這裏就不一一贅述了!
我以爲一個話題或者說一個命題,可以牽扯出別的知識點,學習到更多的技巧,那這個命題就是有價值的,也是有意義的,不想多說了,一張圖結束今天的話題!
若是你以爲你那裏有什麼好的實現方式,也能夠在評論中發出來給你們參考一下!
原創不易,歡迎轉載,轉載時請註明出處,謝謝!