大家學習的時候,一開始小白,,然后接觸到進階的東西的時候,,發(fā)現(xiàn)一切得心應手,有的人可能開始說精通了,。突然有一天,,發(fā)現(xiàn)了一些基于很基礎(chǔ)的東西的騷操作,就開始懷疑人生:wtf JavaScript,? 如果沒有遇到被某些東西打擊到或者見識到新的世界,,可能永遠的,,就感嘆:jQuery真好用,我精通jQuery,,精通js,。要不就是,vue,?angular,?react?我都會,,我精通,。 然而,我現(xiàn)在只能說我只是熟悉,,越學發(fā)現(xiàn)越多坑。 一.數(shù)組類似一些遍歷類型的api:forEach,、map,,可能有人就說了:不就是arr.map(x=>x+1),要是涉及到索引,,那就再來個index,,arr.map((x,index)=>x+index),多簡單是不是 然后,,先拋出一個問到爛的面試題: ['1','2','3'].map(parseInt) 找工作的人,,看過面試題的,都知道結(jié)果是[1,NaN,NaN],,那么為什么會這樣呢,? 首先,map里面可以傳兩個參數(shù):map(對每一個元素都調(diào)用的函數(shù),,該函數(shù)的this值) 而那個每一個元素都調(diào)用的函數(shù),,他傳入的參數(shù)是(current,index,,arr)當前元素(必須),、索引、數(shù)組,。 1.1對parseInt精通了嗎 在這個例子,,對parseInt傳入的就是這三個參數(shù)。 而parseInt這個原生的函數(shù),,他傳入的參數(shù)是(num,,radix): radix表示要解析的數(shù)字的基數(shù)。該值介于 2 ~ 36 之間,。 如果省略該參數(shù)或其值為 0,,則數(shù)字將以 10 為基礎(chǔ)來解析。如果它以 “0x” 或 “0X” 開頭,將以 16 為基數(shù),。如果該參數(shù)小于 2 或者大于 36,,則 parseInt() 將返回 NaN 那就很明顯了,,對于為什么是[1,NaN,NaN],,其實就是: 另外,,parseInt,,遇到字符串的數(shù)字他會盡量解釋,直到不能解釋就停止,。 1.2數(shù)組遍歷的api第二個參數(shù) 第二個參數(shù),表示前面那個函數(shù)內(nèi)部的this,,一般不填這個參數(shù),,this就是undefined。而在非嚴格模式下,,undefined就是window:
我們可以強行把他改成其他的看看:
1.3讓Array成精 我們知道,,Array可以直接生成某一個長度元素全是空的數(shù)組: Array(5)//注意了,5空和5個undefined是不同的 不妨apply一下: 相當于給新創(chuàng)建的array的屬性直接進行改變 1.4你是不是用循環(huán)生成一個序列,? 生成一個序號數(shù)組: 常規(guī)操作,,沒什么問題,,但是精通jQuery的你會不會用到其他方法呢? 比如: 對于最后一個結(jié)果,,點開第二個看看 map的那個函數(shù),,傳入了三個參數(shù),,第一個參數(shù)是當前元素??墒菍τ诩恿薱all的,,第一個參數(shù)就是call的this指向了。而map后面的那個參數(shù),,就是this,,也就是后面那個this已經(jīng)把current覆蓋,起到主導作用的也是后面那個參數(shù),。而map的第一個參數(shù)fn,,fn里面的第二個參數(shù)是index,,也就是當前索引。而對于f.call,,第一個參數(shù)是this指向,,第二個參數(shù)以后全是f.call的函數(shù)f所使用的參數(shù)。最后,,就相當于對每一個元素進行,,Number(index),Boolean(index),,String(index),,Object(index) 2.位操作符基本用法和概念就不說了,自行看文檔,。 2.1字符串轉(zhuǎn)數(shù)字 有全世界都知道的parseInt,,但是我們又可以用簡單一點的方法: 2.2更多的操作 要是我們要隨意得到一個很大的數(shù),,一般就是9999*9999這樣子吧,,而位移操作可以相當于乘上2的n次方: 1<30>30> 好像沒什么用,先拋出一個需求:隨機生成字符串(數(shù)字+字母) 我知道,,很多人完全不需要思考,直接拿起鍵盤擼:比如生成一個6位隨機字符串 對于位操作,,就是短短的代碼解決: 首先生成一個大數(shù),,再轉(zhuǎn)進制,。16進制就是0-9加上前面幾個字母,36進制就是0-9加上26個字母,,那么我們可以得到一個穩(wěn)定的生成n位隨機字符串版本: 另一種方法:(也是基于高進制) 我們可以從Math.random().toString(36)得到一個0.xxx后面有11位小數(shù)的字符串,所以我們只要取第2位以后的就可以了Math.random().toString(36).slice(2) 來一段小插曲 對于追求代碼極其簡短的強迫癥,,看見上面的if -else,,突然想起來平時寫了一大堆if-else實在是不順眼,好的,,除了無腦if和簡短的三元表達式,,我們還有短路表達式: || && a&&b:a為true,跑到b a||b:a為false,,跑b,,a為true就取a 如果在實際應用上面,,代碼將會大大簡潔,,但是可能第一次讓別人看難以理解 位操作交換倆整數(shù) 不用中間變量,,加減法實現(xiàn)交換 a = a+b;b = a-b;a = a-b 用位操作: a ^= b; b ^= a; a ^= b; 具體過程可以這樣子證明: |
|