国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

一些冷門的js操作

ckllj / 2434人閱讀

摘要:突然有一天,發(fā)現(xiàn)了一些基于很基礎(chǔ)的東西的騷操作,就開始懷疑人生如果沒有遇到被某些東西打擊到或者見識(shí)到新的世界,可能永遠(yuǎn)的,就感嘆真好用,我精通,精通。最后,就相當(dāng)于對(duì)每一個(gè)元素進(jìn)行,,,,位操作符基本用法和概念就不說了,自行看文檔。

本文來源于我的github 0.前言

大家學(xué)習(xí)的時(shí)候,一開始小白,然后接觸到進(jìn)階的東西的時(shí)候,發(fā)現(xiàn)一切得心應(yīng)手,有的人可能開始說精通了。突然有一天,發(fā)現(xiàn)了一些基于很基礎(chǔ)的東西的騷操作,就開始懷疑人生:wtf JavaScript?
如果沒有遇到被某些東西打擊到或者見識(shí)到新的世界,可能永遠(yuǎn)的,就感嘆:jQuery真好用,我精通jQuery,精通js。要不就是,vue?angular?react?我都會(huì),我精通。

然而,我現(xiàn)在只能說我只是熟悉,越學(xué)發(fā)現(xiàn)越多坑。
對(duì)于數(shù)據(jù)類型轉(zhuǎn)換和正則的坑,前面有講過:
數(shù)據(jù)類型
正則表達(dá)式

1.數(shù)組

類似一些遍歷類型的api:forEach、map,可能有人就說了:不就是arr.map(x=>x+1),要是涉及到索引,那就再來個(gè)index,arr.map((x,index)=>x+index),多簡(jiǎn)單是不是
然后,先拋出一個(gè)問到爛的面試題:
["1","2","3"].map(parseInt)
找工作的人,看過面試題的,都知道結(jié)果是[1,NaN,NaN],那么為什么會(huì)這樣呢?
首先,map里面可以傳兩個(gè)參數(shù):map(對(duì)每一個(gè)元素都調(diào)用的函數(shù),該函數(shù)的this值)
而那個(gè)每一個(gè)元素都調(diào)用的函數(shù),他傳入的參數(shù)是(current,index,arr)當(dāng)前元素(必須)、索引、數(shù)組。

1.1對(duì)parseInt精通了嗎

在這個(gè)例子,對(duì)parseInt傳入的就是這三個(gè)參數(shù)。
而parseInt這個(gè)原生的函數(shù),他傳入的參數(shù)是(num,radix):
radix表示要解析的數(shù)字的基數(shù)。該值介于 2 ~ 36 之間。
如果省略該參數(shù)或其值為 0,則數(shù)字將以 10 為基礎(chǔ)來解析。如果它以 “0x” 或 “0X” 開頭,將以 16 為基數(shù)。如果該參數(shù)小于 2 或者大于 36,則 parseInt() 將返回 NaN

parseInt(10,10)//對(duì)10進(jìn)制數(shù)字10取整,10
parseInt(10,2)//對(duì)2進(jìn)制數(shù)字10取整,2
parseInt(111,2)//對(duì)2進(jìn)制數(shù)字111取整,7
parseInt(111,4)//對(duì)4進(jìn)制數(shù)字111取整,21
parseInt("1",2,[1])//1,傳入第三個(gè)數(shù)組是沒有意義的
parseInt("1",2,["1","2","3","4"])//1
parseInt("2",2,["1","2","3","4"])//NaN,2進(jìn)制沒有2
parseInt("2",3,["1","2","3","4"])//3

那就很明顯了,對(duì)于為什么是[1,NaN,NaN],其實(shí)就是:

parseInt("1",0,["1","2","3"])//1,radix為 0,則數(shù)字將以 10 為基礎(chǔ)來解析
parseInt("2",1,["1","2","3"])//1進(jìn)制是啥?反正就是NaN
parseInt("3",2,["1","2","3"])//2進(jìn)制沒有3

另外,parseInt,遇到字符串的數(shù)字他會(huì)盡量解釋,直到不能解釋就停止。

parseInt("123sfd")//123
parseInt("123sfd123")//123
parseInt("sfd213")//NaN
1.2數(shù)組遍歷的api第二個(gè)參數(shù)

第二個(gè)參數(shù),表示前面那個(gè)函數(shù)內(nèi)部的this,一般不填這個(gè)參數(shù),this就是undefined。而在非嚴(yán)格模式下,undefined就是window:
[1,2,3].forEach(function(x){console.log(this)})//window
我們可以強(qiáng)行把他改成其他的看看:
[1,2,3].forEach(function(x){console.log(this)},Math)//Math

1.3讓Array成精

我們知道,Array可以直接生成某一個(gè)長(zhǎng)度元素全是空的數(shù)組:
Array(5)//注意了,5空和5個(gè)undefined是不同的
不妨apply一下:

Array.apply(null, { length:5 })//?[undefined, undefined, undefined, undefined, undefined]
Array.apply(null, { "0":1,length:5 })//?[1, undefined, undefined, undefined, undefined]
Array.apply(null, { "2":1,length:5 })//?[undefined, undefined, 1, undefined, undefined]

相當(dāng)于給新創(chuàng)建的array的屬性直接進(jìn)行改變

1.4你是不是用循環(huán)生成一個(gè)序列?

生成一個(gè)序號(hào)數(shù)組:

var arr = [];
for(var i = 0;i<10;i++){
    arr.push(i)
}

常規(guī)操作,沒什么問題,但是精通jQuery的你會(huì)不會(huì)用到其他方法呢?
比如:

Array.apply(null, {length:5 }).map(f.call,Number)//[0, 1, 2, 3, 4],f可以是任何函數(shù)
Array.apply(null, { "0":1,length:5 }).map(f.call,Number)//[0, 1, 2, 3, 4],不管元素是什么都一樣
Array.apply(null, {length:5 }).map(f.call,Boolean)//[false, true, true, true, true]
Array.apply(null, {length:5 }).map(f.call,String)//["0", "1", "2", "3", "4"]
Array.apply(null, {length:5 }).map(eval.call,Object)//[Number, Number, Number, Number, Number]

對(duì)于最后一個(gè)結(jié)果,點(diǎn)開第二個(gè)看看

map的那個(gè)函數(shù),傳入了三個(gè)參數(shù),第一個(gè)參數(shù)是當(dāng)前元素。可是對(duì)于加了call的,第一個(gè)參數(shù)就是call的this指向了。而map后面的那個(gè)參數(shù),就是this,也就是后面那個(gè)this已經(jīng)把current覆蓋,起到主導(dǎo)作用的也是后面那個(gè)參數(shù)。而map的第一個(gè)參數(shù)fn,fn里面的第二個(gè)參數(shù)是index,也就是當(dāng)前索引。而對(duì)于f.call,第一個(gè)參數(shù)是this指向,第二個(gè)參數(shù)以后全是f.call的函數(shù)f所使用的參數(shù)。最后,就相當(dāng)于對(duì)每一個(gè)元素進(jìn)行,Number(index),Boolean(index),String(index),Object(index)

2.位操作符

基本用法和概念就不說了,自行看文檔。

2.1字符串轉(zhuǎn)數(shù)字

有全世界都知道的parseInt,但是我們又可以用簡(jiǎn)單一點(diǎn)的方法:

//就是讓他進(jìn)行不改變本身的值的數(shù)學(xué)運(yùn)算
+"1"
"1"*1
"1"|0
"1" >> 0
"1" << 0
2.2更多的操作

要是我們要隨意得到一個(gè)很大的數(shù),一般就是9999*9999這樣子吧,而位移操作可以相當(dāng)于乘上2的n次方:1<<30//1073741824
好像沒什么用,先拋出一個(gè)需求:隨機(jī)生成字符串(數(shù)字+字母)
我知道,很多人完全不需要思考,直接拿起鍵盤擼:比如生成一個(gè)6位隨機(jī)字符串

var n = 6
var str = "abcdefghijklmnopqrstuvwxyz0123456789"
var result = ""
for (var i = 0 ;i

對(duì)于位操作,就是短短的代碼解決:

(~~(Math.random()*(1<<24))).toString(16)
(~~(Math.random()*(1<<30))).toString(36)

首先生成一個(gè)大數(shù),再轉(zhuǎn)進(jìn)制。16進(jìn)制就是0-9加上前面幾個(gè)字母,36進(jìn)制就是0-9加上26個(gè)字母,那么我們可以得到一個(gè)穩(wěn)定的生成n位隨機(jī)字符串版本:

function f(n){
    if(n==1) return (~~(Math.random()*36)).toString(36)
    return (~~(Math.random()*36)).toString(36) + f(n-1)
}
//尾遞歸優(yōu)化
function k(n){
    return function f(n,s){
        if(n==1) return s
        return  f(n-1,(~~(Math.random()*36)).toString(36)+s)
    }(n,(~~(Math.random()*36)).toString(36))
}

另一種方法:(也是基于高進(jìn)制)
我們可以從Math.random().toString(36)得到一個(gè)0.xxx后面有11位小數(shù)的字符串,所以我們只要取第2位以后的就可以了Math.random().toString(36).slice(2)

來一段小插曲

對(duì)于追求代碼極其簡(jiǎn)短的強(qiáng)迫癥,看見上面的if -else,突然想起來平時(shí)寫了一大堆if-else實(shí)在是不順眼,好的,除了無腦if和簡(jiǎn)短的三元表達(dá)式,我們還有短路表達(dá)式:
|| &&
a&&b:a為true,跑到b
a||b:a為false,跑b,a為true就取a

//來一個(gè)有點(diǎn)智障的例子
function f(a){
if(a==1) console.log(1)
if(a==2) console.log(2)
if(a==3) console.log(3)
}

//一定要記得寫分號(hào)
function f(a){
(a==1)&& console.log(1);
(a==2) &&console.log(2);
(a==3) &&console.log(3);
}

如果在實(shí)際應(yīng)用上面,代碼將會(huì)大大簡(jiǎn)潔,但是可能第一次讓別人看難以理解

位操作交換倆整數(shù)

不用中間變量,加減法實(shí)現(xiàn)交換
a = a+b;b = a-b;a = a-b
用位操作:
a ^= b;
b ^= a;
a ^= b;

具體過程可以這樣子證明:

我們先令a0 = a, b0 = b。a = a ^ b 可以轉(zhuǎn)化為a = a0 ^ b
第二句:b = b ^ a =  b0 ^ a = b0 ^ (a0 ^ b0) = a0 ^ (b0 ^ b0) = a0 ^ 0 = a0//達(dá)到了原始值a0和實(shí)際值b交換
第三句一樣:a = a ^ b = a ^ (b0 ^ a) = b0 ^ (a ^ a)= b0 ^ 0 = b0,和原始的b0交換成功
3. 構(gòu)造類

繼續(xù)回到前面的例子:

Array.apply(null, {length:5 }).map(f.call,Number)//[0, 1, 2, 3, 4],f可以是任何函數(shù)
Array.apply(null, { "0":1,length:5 }).map(f.call,Number)//[0, 1, 2, 3, 4],不管元素是什么都一樣
Array.apply(null, {length:5 }).map(f.call,Boolean)//[false, true, true, true, true]
Array.apply(null, {length:5 }).map(f.call,String)//["0", "1", "2", "3", "4"]
Array.apply(null, {length:5 }).map(eval.call,Object)//[Number, Number, Number, Number, Number]

map第二個(gè)參數(shù)ctx是this指向,而第一個(gè)參數(shù)是一個(gè)函數(shù)f(任何函數(shù)),f的第一個(gè)參數(shù)已經(jīng)報(bào)廢,因?yàn)榈谝粋€(gè)參數(shù)是call的上下文this,但是這個(gè)this又被后面的ctx替代了,因此f有效的參數(shù)是從第二個(gè)開始,最后就相當(dāng)于ctx(index),即是 :構(gòu)造類(index)

于是我們又可以看看構(gòu)造類另一個(gè)有意思的地方

var toFixed = 1;
var obj = {
     toFixed:"我只是客串的",
    show:function(){
        return this. toFixed;
    }
}
obj.show.call( toFixed);   //? toFixed() { [native code] }

也許一眼看上去是1,然而call的第一個(gè)參數(shù)居然不是null、undefined,效果不一樣了。
我們call的上下文就是toFixed。可以這樣理解,對(duì)于js內(nèi)部,1其實(shí)是構(gòu)造類Number(1)構(gòu)造出來的,相當(dāng)于this指向了Number,而我們可以打印一下Number.prototype,結(jié)果有

我們把toFixed方法打印出來了

對(duì)于String也是可以的

var big = "1sdasdsadsdasd";//不是字符串的話,其他構(gòu)造類沒有big方法,返回undefined
var obj = {
    big:"我是客串的",
    show:function(){
        return this.big;
    }
}
obj.show.call(big);  //? big() { [native code] }

//或者說,打印一個(gè)length看看
var l = "1sdasdsadsdasd";//變量換成l
var obj = {
    length:"我是客串的",
    show:function(){
        return this.length;//主要是這個(gè),變量是什么不重要
    }
}
obj.show.call(l); //14

屬性太多了,可以去控制臺(tái)看看String.prototype有什么。

再或者說,看看函數(shù)執(zhí)行起來會(huì)發(fā)生什么事情:

var l = true;//這次試一下boolean類型
var obj = {
    length:"我是客串的",
    show:function(){
        return this.valueOf();//這次我們不打印這個(gè)函數(shù)了,讓他執(zhí)行
    }
}
obj.show.call(l,this); //true,直接調(diào)用類型轉(zhuǎn)換過程中的那個(gè)valueOf

道理都是一樣,大家自己可以回去玩一下

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/94361.html

相關(guān)文章

  • 給新手準(zhǔn)備一些常用冷門知識(shí)點(diǎn)

    摘要:退回上一頁(yè)面時(shí)代碼是不會(huì)再重復(fù)運(yùn)行的但代碼會(huì)重新運(yùn)行一次所以我們可以用此點(diǎn)解決登錄驗(yàn)證失敗退回登錄界面時(shí)驗(yàn)證碼不刷新的問題通過代碼給加屬性這樣就可以重新刷新驗(yàn)證碼表單的項(xiàng)一般寫成的形式這樣就可以直接把數(shù)據(jù)提交當(dāng)前模塊的當(dāng)前控制器的當(dāng)前方法來 1、退回上一頁(yè)面時(shí),html代碼是不會(huì)再重復(fù)運(yùn)行的,但JS代碼會(huì)重新運(yùn)行一次,所以我們可以用此點(diǎn)解決 登錄驗(yàn)證失敗退回登錄界面時(shí),驗(yàn)證碼不刷新的問...

    thekingisalwaysluc 評(píng)論0 收藏0
  • 冷門PHP函數(shù)匯總

    摘要:后續(xù)在日常開發(fā)中如遇到更多的冷門,會(huì)更新本文章獲取系統(tǒng)的負(fù)載創(chuàng)建一個(gè)包含變量名和它們的值的數(shù)組基于以微秒計(jì)的當(dāng)前時(shí)間,生成一個(gè)唯一的。規(guī)定在包裝數(shù)據(jù)時(shí)所使用的格式。如果有什么冷門的函數(shù),可在評(píng)論區(qū)留言。有時(shí)冷門函數(shù)也會(huì)幫上大忙不是嘛 概述 整理一些日常生活中基本用不到的PHP函數(shù),也可以說在框架內(nèi)基本都內(nèi)置了,無需我們?nèi)プ孕惺褂玫暮瘮?shù)。量不多。后續(xù)在日常開發(fā)中如遇到更多的冷門,會(huì)更新本...

    gougoujiang 評(píng)論0 收藏0
  • 彈性盒模型冷門知識(shí)

    摘要:可以出現(xiàn)居中的,兩邊元素分別為彈性盒模型中的標(biāo)簽可能會(huì)出現(xiàn)默認(rèn)寬度,并且不可以用覆蓋,只能設(shè)置為類似以下結(jié)構(gòu)的有一定高度這個(gè)容器占據(jù)下部剩余空間這個(gè)容器在左邊作為目錄這個(gè)容器是一個(gè)搜索欄這里理論上是剩余空 可以出現(xiàn)居中的border,兩邊元素分別為49.5px a b 彈性盒模型中的input標(biāo)簽可能會(huì)出現(xiàn)默認(rèn)寬度,并且不可以用fle...

    DevYK 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<