標籤:對象 迴圈 知識點 com 想法 通過 fill style 並且
以前看過一句話基礎的不一定簡單,一直沒體會到,今天終於見識到了。反思了下自己之前的工作學習,一句話總結,很浮躁。不多說,來個小的例子挑戰下。
Array.from()。對你沒看錯,就是這個簡單的api,用來將有length屬性的資料結構轉換為數組,在轉換之前可以使用map對每一個產生的值做處理。看到這裡你可能一略而過,很簡單嗎?不就是轉換嗎?
那麼接下來我來引申幾個問題。
問題1:Array.from()的這個api相容性如何?你會看到ie不相容。如果你想用怎麼辦?看看polyfill實現吧。然後polyfill的實現是怎樣的過程呐?思路是怎樣的?裡邊又有哪些細節需要你注意呐?我總結下來的有
1:判斷資料類型,我們看Array.from(param,fnc,thisArg)。我們自己來寫,我們是不是得首先判斷fnc是不是一個函數呐?用到了什麼呐?對object.prototype.call(fnc) === "[object,Function]";那麼這時候又有問題了如果我要判斷所有的資料類型呐?
2:使用call。我們傳入的fnc。如何給她傳遞進去當前迴圈的item,index,arr,並且改變fnc中的this為thisArg,這時候用到了call。call不瞭解?可能你去看下call,發現還有apply,bind。是不是得對比下。然後再看看相容性?是不是會引申其他問題?
問題2:Array.from能解決我們實際編程中什麼問題呐?基礎的將各種帶有length屬性的類型資料變為數組。這些類型包括哪些呐?set,map,arguments,nodeList, string,甚至{length: 5}。複雜的實現數組合并去重。怎樣去重呐?
function combine(){ let arr = [].concat.apply([], arguments); //沒有去重複的新數組 return Array.from(new Set(arr));} var m = [1, 2, 2], n = [2,3,3]; console.log(combine(m,n));
這是es6中的去重的簡單實現。那麼我們要考慮他的效能問題了,時間複雜度,空間複雜度。還有哪些實現去重的方法呐?你是不是得總結下。權衡下執行需要的時間和空間,選擇合適的去重方法。
比如,利用一個新數組,或者一個新的對象,依次把每個元素加入到對應的新數組,新對象中。然後判斷indexOf(item) != -1加入。!obj[item] 。也可以利用filter。forEach.同樣通過indexOf實現。
還有一種靠源生實現的。基本的想法是,判斷當前一個和下一個,如果重複了,那麼忽略這個元素,取下一個元素,如果沒有重複的那麼添加到我們建立的新數組。show code
function qc(arr) {if (object.prototype.toString(arr) != ‘[object, Array]‘) { throw newError(‘the qc need Array‘)}var newArr = [] for(let i=0,len=arr.length;i<len;i++){ for(let j=i+1;j<len;j++){ // 如果重複,則i向前推進,但不管重複項 if(arr[i]==arr[j]) j= ++i } // 將沒有重複項的推入到新數組 newArr.push(arr[i]) } return newArr}
來挑戰下你的js基本功,原來以前認為的基礎紮實都是空中樓閣。由Array.from引申的知識點。包括數組排序,call,apply,bind。等等。