常用JavaScript小技巧及原理詳解

善于利用JS中的小知識的利用,可以很簡潔的編寫代碼

1. 使用!!模擬Boolean()函數(shù)

原理:邏輯非操作一個數(shù)據(jù)對象時袁滥,會先將數(shù)據(jù)對象轉換為布爾值菱父,然后取反,兩個!!重復取反除师,就實現(xiàn)了轉換為布爾值的效果。

2. 使用一元加(+)模擬Number()函數(shù)

原理:對非數(shù)值類型的數(shù)據(jù)使用一元加(+)扔枫,會起到與Number()函數(shù)相同的效果汛聚。

  • null轉換為0
  • undefined轉換為NaN
  • false轉換為0,true轉換為1
  • 對于字符串:
  • 空字串轉換為0
  • 含有數(shù)字或者浮點數(shù)或者十六進制格式的數(shù)據(jù)(11, 0.3, 0xfe等)短荐,轉換為相應的數(shù)值
  • 含有其他格式字符倚舀,無法轉換為數(shù)值的字符串,轉換為NaN
  • 對于對象忍宋,先調(diào)用valueOf()方法痕貌,在轉換,若結果為NaN糠排,那么再調(diào)用toString()方法舵稠,之后再轉換

3. 使用邏輯與(&&)進行短路操作

if(connected){
    login();
}

以上代碼可以簡化為

connected && login()

也可以用這種方法來檢查對象中是否存在某個屬性

user && user.login

原理:邏輯與(&&)會首先對第一個操作數(shù)進行求值,只有求值結果為true時才會對第二個操作數(shù)求值入宦。connected && login()中哺徊,若判斷connected不為true,則不再進行下一步操作。
所謂的短路操作即第一個操作數(shù)可以決定結果乾闰,則不再對第二個操作數(shù)進行求值落追。

4. 使用邏輯或(||)設置默認值

邏輯或(||)也屬于短路操作,即當?shù)谝粋€操作數(shù)可以決定結果時汹忠,不再對第二個操作數(shù)進行求值淋硝。
利用這個特點,我們可以給賦值語句設置默認值宽菜。只有當?shù)谝粋€操作數(shù)為null或者undefined時,才會把第二個操作數(shù)賦值給目標竿报。

function User(name, age){
    this.name = name || "Liming";
}

上述代碼中铅乡,如果函數(shù)中沒有傳入name參數(shù),name的值為undefined烈菌,那么就會給this.name賦值為"Liming"阵幸。
ES6中可以為函數(shù)設置默認值花履,所以這個無需在函數(shù)中使用,但是其他地方還是很有用的挚赊。

5. 獲取數(shù)組最后n個元素

可以使用以下代碼獲取數(shù)組中最后n個元素

var array = [1, 2, 3, 4, 5, 6];
console.log(array.slice(-1));  //[6]
console.log(array.slice(-2));  //[5, 6]

原理:Array.prototype.slice(begin,end)可以用來裁剪數(shù)組诡壁,第二個參數(shù)的默認值是數(shù)組的長度值。若值傳入一個參數(shù)荠割,則會返回從指定索引開始到數(shù)組結尾的所有值妹卿。
而slice()方法還可以接收負值,當傳入負值時蔑鹦,會自動加上數(shù)組的長度值使其轉換為正值夺克,于是便得到了最后的n個值。

6. 合并大數(shù)組

常用的合并數(shù)組的方式是使用Array.concat()函數(shù)嚎朽。該函數(shù)會創(chuàng)建一個新數(shù)組铺纽,將兩個數(shù)組連接起來存儲到新數(shù)組中,這會大量消耗內(nèi)存哟忍〗泼牛可以使用Array.push.apply(arr1, arr2),它不會創(chuàng)建新數(shù)組锅很,而是將第二個數(shù)組合并到第一個數(shù)組中其馏,以減少內(nèi)存的消耗。

var a = [1,2];
var b = [3,4];
console.log(a.push.apply(a, b));      // [1,2,3,4]
//或者
console.log(Array.prototype.push.apply(a, b));      // [1,2,3,4]

原理: Array.push()是在數(shù)組的末尾增加元素粗蔚,但是如果使用a.push(b)會把整個數(shù)組b當作一個元素添加到數(shù)組a中尝偎。
而apply()方法,則允許將某個方法的參數(shù)以數(shù)組的形式傳入鹏控,所以起到了將數(shù)組b中的元素追加到數(shù)組a中的效果致扯。

7. NodeList轉換為數(shù)組

使用document.querySelectorAll('div')返回的是NodeList對象,雖然它很像數(shù)組当辐,但是并不能使用諸如sort()抖僵,filter()等方法。你可以將其轉換為真正的數(shù)組缘揪。

var eles = document.querySelectorAll('p');  //NodeList
var arrayElements = [].slice.call(eles);       //轉化為數(shù)組
// 或者
var arrayElements = Array.prototype.slice.call(eles);
// 或者
var arrayElements = Array.from(eles);

原理:

  • [].slice.call(eles):
    首先創(chuàng)建了一個空數(shù)組[]耍群,然后調(diào)用他的slice()方法,但是在slice()方法的執(zhí)行中找筝,把this對象指向了eles,所以會對eles進行裁減蹈垢,由于對slice()方法沒有傳入?yún)?shù),所以相當于slice(0,eles.length),會按照元長度返回一個數(shù)組袖裕。
  • Array.prototype.slice.call(eles):
    原理與上面相似曹抬,只不過這次沒有創(chuàng)建空數(shù)組,而是直接使用了原型中的方法
  • Array.from()
    Array.from()接受一個類數(shù)組對象或者可迭代對象急鳄,基于該對象創(chuàng)建一個新的Array實例谤民。
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末堰酿,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子张足,更是在濱河造成了極大的恐慌触创,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件为牍,死亡現(xiàn)場離奇詭異哼绑,居然都是意外死亡,警方通過查閱死者的電腦和手機吵聪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門凌那,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人吟逝,你說我怎么就攤上這事帽蝶。” “怎么了块攒?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵励稳,是天一觀的道長。 經(jīng)常有香客問我囱井,道長驹尼,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任庞呕,我火速辦了婚禮新翎,結果婚禮上,老公的妹妹穿的比我還像新娘住练。我一直安慰自己地啰,他們只是感情好,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布讲逛。 她就那樣靜靜地躺著亏吝,像睡著了一般。 火紅的嫁衣襯著肌膚如雪盏混。 梳的紋絲不亂的頭發(fā)上蔚鸥,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機與錄音许赃,去河邊找鬼止喷。 笑死,一個胖子當著我的面吹牛混聊,可吹牛的內(nèi)容都是我干的启盛。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼技羔,長吁一口氣:“原來是場噩夢啊……” “哼僵闯!你這毒婦竟也來了?” 一聲冷哼從身側響起藤滥,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤鳖粟,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后拙绊,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體向图,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年标沪,在試婚紗的時候發(fā)現(xiàn)自己被綠了榄攀。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡金句,死狀恐怖檩赢,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情违寞,我是刑警寧澤贞瞒,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站趁曼,受9級特大地震影響军浆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜挡闰,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一乒融、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧摄悯,春花似錦赞季、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至叨橱,卻和暖如春典蜕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背罗洗。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工愉舔, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人伙菜。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓轩缤,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子火的,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容

  • 第5章 引用類型(返回首頁) 本章內(nèi)容 使用對象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學一百閱讀 3,212評論 0 4
  • PHP常用函數(shù)大全 usleep() 函數(shù)延遲代碼執(zhí)行若干微秒壶愤。 unpack() 函數(shù)從二進制字符串對數(shù)據(jù)進行解...
    上街買菜丶迷倒老太閱讀 1,352評論 0 20
  • php usleep() 函數(shù)延遲代碼執(zhí)行若干微秒。 unpack() 函數(shù)從二進制字符串對數(shù)據(jù)進行解包馏鹤。 uni...
    思夢PHP閱讀 1,981評論 1 24
  • 這世界那么大 我們這么小 還有什么值得炫耀 你有你的苦衷 我有我的煩惱 最好保持距離互不干擾
    地球最后的夜晚閱讀 221評論 5 5
  • 這次我真的要走了征椒,踏著那條金黃的鯉魚 水仙花已經(jīng)開到了盡頭 點一柱香吧 滿地的心灰,總要有人打掃 看到那個水壺了嗎...
    明知故犯閱讀 199評論 0 1