摘要:接觸這么多年,第一次總結(jié)一下它的遍歷語(yǔ)法。而且你必須借助特定的結(jié)構(gòu)才能遍歷數(shù)據(jù)結(jié)構(gòu)。它的作用是遍歷對(duì)象的鍵名。建議僅在遍歷數(shù)組的時(shí)候使用。另一個(gè)優(yōu)點(diǎn)是,它可以遍歷任何部署了接口的數(shù)據(jù)結(jié)構(gòu),甚至是非的數(shù)據(jù)類(lèi)型,即自己定義的數(shù)據(jù)結(jié)構(gòu)。
接觸JavaScript這么多年,第一次總結(jié)一下它的遍歷語(yǔ)法。以前我大部分時(shí)間都在老版本的JavaScript下寫(xiě)代碼,所以大部分時(shí)間都是用for...in,隨著ES6的發(fā)布,有必要對(duì)各個(gè)遍歷語(yǔ)法進(jìn)行梳理,指出它的優(yōu)缺點(diǎn)。
for/while循環(huán)語(yǔ)句這就不多說(shuō)了,所有語(yǔ)言都會(huì)涉及的循環(huán)。不過(guò)單純的for/while能力有限,而且性能上也堪憂。而且你必須借助特定的結(jié)構(gòu)才能遍歷數(shù)據(jù)結(jié)構(gòu)。這里就不詳解了,簡(jiǎn)單舉例:
var arr = [1,2,3]; for(var i = 0,len = arr.length;i < len;i ++) { var value = arr[i]; }for...in語(yǔ)句
這也是JavaScript比較早特有的一個(gè)語(yǔ)句。它的作用是遍歷對(duì)象的鍵名。
用法
var obj = { a : "1", b : "2", c : "3" }; for(var key in obj) { var value = obj[key]; }
優(yōu)點(diǎn)
它可以支持所有對(duì)象類(lèi)型的數(shù)據(jù),包括數(shù)組,甚至是函數(shù)等。而且語(yǔ)法簡(jiǎn)單,在其他語(yǔ)言中都很少看到。
缺點(diǎn)
不僅遍歷普通鍵,連原型鏈上的鍵都去遍歷了。
建議
在遍歷常用對(duì)象時(shí)使用,這里的常用對(duì)象,就是我們上面舉例的鍵值對(duì)(不是Map)。
forEach方法在php中都有foreach語(yǔ)法,但是JavaScript中并沒(méi)有,而且php中的foreach遍歷對(duì)象也OK。但在JavaScript中,forEach僅是數(shù)組提供的內(nèi)置方法。
用法
[1,2,3].forEach(function(value,index){ console.log(index + ":" + value); });
有點(diǎn)
可以同時(shí)獲取index和value,不必再像以前遍歷數(shù)組那樣,還要再在for的{}去獲取值。
缺點(diǎn)
僅支持?jǐn)?shù)組。而且一旦調(diào)用,會(huì)完全遍歷一次,break, continue, return都無(wú)效。
建議
僅在遍歷數(shù)組的時(shí)候使用。
for...of語(yǔ)句這是ES6新增的語(yǔ)法,它基于ES6新增的Iterator和Symbol開(kāi)發(fā)的,也就是說(shuō)我們用ES5代碼只能模擬,但無(wú)法從原理上實(shí)現(xiàn)它。
用法
var list = new Map().set("a",1).set("b",2).set("c",3); for (var [key,value] of list) { console.log(key + " => " + value); }
優(yōu)點(diǎn)
在遍歷中直接取值。感覺(jué)上和for...in形成互補(bǔ),一個(gè)在遍歷中取鍵名,另一個(gè)取值。另一個(gè)優(yōu)點(diǎn)是,它可以遍歷任何部署了Iterator接口的數(shù)據(jù)結(jié)構(gòu),甚至是非JavaScript的數(shù)據(jù)類(lèi)型,即自己定義的數(shù)據(jù)結(jié)構(gòu)。
缺點(diǎn)
除了Map結(jié)構(gòu)外,不能取到鍵名。不能用來(lái)遍歷普通對(duì)象。
建議
在遍歷時(shí)想要值的時(shí)候,可以使用,但不能用在普通對(duì)象上面。Map類(lèi)型推薦使用。
遞歸(尾調(diào)用)ES6中對(duì)函數(shù)尾調(diào)用進(jìn)行了優(yōu)化,而如果尾調(diào)用結(jié)構(gòu)還是一個(gè)遞歸函數(shù),那么更加節(jié)省性能,簡(jiǎn)直升天。
用法
function forEach(object,factory,_keyIndex = 0,_keys = object.keys()) { var key = _keys[_keyIndex]; var value = object[key]; if(typeof factory === "function") factory(key,value); _keyIndex ++; return forEach(object,factory,_keyIndex,_keys); } var obj = { a : 1, b : 2, c : 3 }; forEach(obj,function(key,value){ console.log(key + " => " + value); });
優(yōu)點(diǎn)
可以不涉及循環(huán),遞歸的性能高于循環(huán),特別是尾調(diào)遞歸。
缺點(diǎn)
代碼結(jié)構(gòu)復(fù)雜,千變?nèi)f化,沒(méi)有統(tǒng)一的規(guī)律可以掌握。
建議
當(dāng)處理比較復(fù)雜的數(shù)據(jù),可能用循環(huán)會(huì)消耗掉性能,而又比較在意性能的時(shí)候使用。
map、filter方法map方法也可以遍歷數(shù)組,但是它的主要用途是在遍歷過(guò)程中進(jìn)行修改,而filter遍歷過(guò)程一樣,但是只是通過(guò)回調(diào)函數(shù)的返回值來(lái)確定是不是要保留當(dāng)前遍歷到的這個(gè)值。也就是說(shuō),這兩個(gè)方法都可能會(huì)修改被遍歷的數(shù)組本身。
第三方each、map方法:理想方法包括jQuery和underscore都提供了each。這是我們理想是使用方法,它結(jié)合了上面的forEach, for...of,是我們最希望得到的方法。
用法
$.each(object,(key,value) => { console.log(key + " => " + value); }); [1,2,3].each((index,value) => { console.log(index + ":" + value); });
優(yōu)點(diǎn)
對(duì)我們最常用的array和object兩種類(lèi)型進(jìn)行遍歷都可以,同時(shí)可以得到鍵名和值。
缺點(diǎn)
性能上不確定,畢竟不是語(yǔ)言的原生,內(nèi)部肯定經(jīng)過(guò)加工處理。而且目前不知道是否對(duì)Map等結(jié)構(gòu)支持。
建議
在復(fù)雜度比較高的情況下,希望代碼簡(jiǎn)潔明確,同時(shí)也基于這些第三方庫(kù)的情況下使用。其實(shí)性能上也不用太過(guò)擔(dān)心,畢竟現(xiàn)在的電腦都很牛逼。
這篇文章最早發(fā)布在我的博客 http://www.tangshuang.net/286...
可以加我微信號(hào)和我交流:wwwtangshuangnet
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/91089.html
摘要:年月歐洲計(jì)算機(jī)制造商協(xié)會(huì)發(fā)表了標(biāo)準(zhǔn),它是的一個(gè)擴(kuò)延,它也被稱為年月首版年月日截止發(fā)布日期,的官方名稱是,國(guó)際意在更頻繁地發(fā)布包含小規(guī)模增量更新的新版本,下一版本將于年發(fā)布,命名為。 前端最基礎(chǔ)的就是 HTML+CSS+Javascript。掌握了這三門(mén)技術(shù)就算入門(mén),但也僅僅是入門(mén),現(xiàn)在前端開(kāi)發(fā)的定義已經(jīng)遠(yuǎn)遠(yuǎn)不止這些。前端小課堂(HTML/CSS/JS),本著提升技術(shù)水平,打牢基礎(chǔ)知識(shí)的...
摘要:中可以實(shí)現(xiàn)遍歷的數(shù)據(jù)類(lèi)型主要是對(duì)象,其中包括普通對(duì)象與數(shù)組。遍歷器是一種接口,為各種不同的數(shù)據(jù)結(jié)構(gòu)提供統(tǒng)一的訪問(wèn)機(jī)制。實(shí)例五遍歷器對(duì)象實(shí)例五是的遍歷過(guò)程,通過(guò)手動(dòng)調(diào)用其對(duì)象的方法實(shí)現(xiàn)信息獲取。為每個(gè)數(shù)組元素執(zhí)行函數(shù)。 前言 ??將依據(jù)自身痛點(diǎn)學(xué)習(xí),計(jì)劃對(duì)原生JavaScript寫(xiě)一個(gè)系統(tǒng),本文為第一篇,感興趣的同學(xué)可以關(guān)注個(gè)人公眾號(hào):ZeroToOneMe,或者github博客,將持續(xù)...
摘要:執(zhí)行棧清空后,檢查微任務(wù)隊(duì)列,將可執(zhí)行的微任務(wù)全部執(zhí)行。對(duì)象的錯(cuò)誤具有冒泡性質(zhì),會(huì)一直向后傳遞,直到被捕獲為止。返回的遍歷器對(duì)象,可以依次遍歷函數(shù)內(nèi)部的每一個(gè)狀態(tài)。表示函數(shù)里有異步操作,表示緊跟在后面的表達(dá)式需要等待結(jié)果。 javascript 是單線程執(zhí)行的,由js文件自上而下依次執(zhí)行。即為同步執(zhí)行,若是有網(wǎng)絡(luò)請(qǐng)求或者定時(shí)器等業(yè)務(wù)時(shí),不能讓瀏覽器傻傻等待到結(jié)束后再繼續(xù)執(zhí)行后面的js吧...
摘要:由于這些是驅(qū)動(dòng)的工具,因此它們由引擎提供支持。兩個(gè)主要引擎是的和的引擎。然后,四個(gè)即時(shí)進(jìn)程啟動(dòng),分析并執(zhí)行解析器生成的字節(jié)碼。簡(jiǎn)單來(lái)說(shuō),這個(gè)引擎獲取源代碼,將其分解為字符串,獲取這些字符串并將它們轉(zhuǎn)換為編譯器可以理解的字節(jié)碼,然后執(zhí)行它。 渲染引擎和JavaScript引擎 先從一張圖片來(lái)理解下這兩個(gè)引擎 showImg(https://segmentfault.com/img/bVb...
摘要:由于這些是驅(qū)動(dòng)的工具,因此它們由引擎提供支持。兩個(gè)主要引擎是的和的引擎。然后,四個(gè)即時(shí)進(jìn)程啟動(dòng),分析并執(zhí)行解析器生成的字節(jié)碼。簡(jiǎn)單來(lái)說(shuō),這個(gè)引擎獲取源代碼,將其分解為字符串,獲取這些字符串并將它們轉(zhuǎn)換為編譯器可以理解的字節(jié)碼,然后執(zhí)行它。 渲染引擎和JavaScript引擎 先從一張圖片來(lái)理解下這兩個(gè)引擎 showImg(https://segmentfault.com/img/bVb...
閱讀 3715·2021-11-17 09:33
閱讀 2725·2021-09-22 15:12
閱讀 3344·2021-08-12 13:24
閱讀 2439·2019-08-30 11:14
閱讀 1733·2019-08-29 14:09
閱讀 1326·2019-08-26 14:01
閱讀 3061·2019-08-26 13:49
閱讀 1775·2019-08-26 12:16