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

資訊專欄INFORMATION COLUMN

javascript的幾種常見(jiàn)遍歷數(shù)據(jù)結(jié)構(gòu)的語(yǔ)法

kohoh_ / 587人閱讀

摘要:接觸這么多年,第一次總結(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

相關(guān)文章

  • 前端培訓(xùn)-初級(jí)階段(13、18)

    摘要:年月歐洲計(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í)的...

    YorkChen 評(píng)論0 收藏0
  • JavaScript遍歷

    摘要:中可以實(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ù)...

    ThinkSNS 評(píng)論0 收藏0
  • javascript 異步編程

    摘要:執(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吧...

    Nino 評(píng)論0 收藏0
  • JavaScript引擎

    摘要:由于這些是驅(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...

    馬龍駒 評(píng)論0 收藏0
  • JavaScript引擎

    摘要:由于這些是驅(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...

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

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

0條評(píng)論

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