本篇文章為大家展示了JavaScript中循環(huán)之間的技術(shù)差異是怎樣的,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
成都創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比五峰網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式五峰網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋五峰地區(qū)。費用合理售后完善,10余年實體公司更值得信賴。
在 JavaScript 中使用循環(huán)時,需要理解兩個關(guān)鍵點:可枚舉的屬性和可迭代的對象。
可枚舉的屬性
可枚舉對象的一個定義特征是,當(dāng)通過賦值操作符向?qū)ο蠓峙鋵傩詴r,我們將內(nèi)部 enumerable 標(biāo)志設(shè)置為true,這是默認值。
當(dāng)然,我們可以通過將其設(shè)置為false來更改此行為。
要點:可枚舉的屬性都可以用for...in 遍歷出來。
舉個例子看看:
// 會出現(xiàn)在 for ... in 循環(huán)中 const gbols = {}; gbols.platform = "LogRocket"; Object.getOwnPropertyDescriptor(gbols, "platform"); // {value: "LogRocket", writable: true, enumerable: true, configurable: true} for (const item in gbols) { console.log(item) } // platform // 不會出現(xiàn)在 for ... in 循環(huán)中 // 將 enumerable 設(shè)置為 false Object.defineProperty(gbols, 'role', {value: 'Admin', writable: true, enumerable: false}) for (const item in gbols) { console.log(item) } // platform
可迭代的對象
如果一個對象定義了它的迭代行為,那么它就是可迭代的。在這種情況下,將在for …of構(gòu)造中循環(huán)的值將定義其迭代行為??傻膬?nèi)置類型包括Arrays、Strings、Sets和Maps 。object 是不可迭代的,因為它沒有指定@iterator method。
在Javascript中,所有可迭代都是可枚舉的,但不是所有的可枚舉都是可迭代的。
for …in在數(shù)據(jù)中查找對象,而for ..of查找重復(fù)序列。來個例子看看:
const authors = ['小智', '小王', '小明', '小紅']; // 與 for in 循環(huán)一起使用 fro (const author in authors) { console.log(author) } // 打印: 0,1,2,3 for (const author of authors) { console.log(author) } // 打印:小智 小王 小明 小紅
使用此構(gòu)造時,需要牢記的是,如果調(diào)用了 typeof 得到的類型是 object,則可以使用for…in循環(huán)。
我們來看一下對authors變量的操作:
typeof authors // 打印的是 “object”,因此我們可以使用`for ..in`
乍一看感覺有點奇怪,但必須注意,數(shù)組是一種特殊的對象,它以索引為鍵。for ...in循環(huán)找到對象時,它將循環(huán)遍歷每個鍵。
for …in 遍歷 authors 數(shù)組的方式可以用下面顯式化的方式來理解:
const authors = { 0: 'Jade', 1: 'Dafe', 2: 'Gbols', 3: 'Daniel' }
重要說明:如果可以追溯到對象(或從對象原型鏈繼承它),因為for …in將以不特定的順序遍歷鍵。
同時,如果實現(xiàn) for.. of 構(gòu)造的迭代器,則它將在每次迭代中循環(huán)遍歷該值。
ForEach 和 map 方法
盡管可以使用forEach和map方法來實現(xiàn)相同的目標(biāo),但是它們的行為和性能方面存在差異。
基礎(chǔ)層面上,當(dāng)函數(shù)被調(diào)用時,它們都接收一個回調(diào)函數(shù)作為參數(shù)。
考慮下面的代碼片段:
const scoresEach = [2,4 ,8, 16, 32]; const scoresMap = [2,4 ,8, 16, 32]; const square = (num) => num * num;
我們逐一列出其操作上的一些差異。
forEach返回undefined,而map返回一個新數(shù)組:
let newScores = [] const resultWithEach = scoresEach.forEach((score) => { const newScore = square(score); newScores.push(newScore); }); const resultWithMap = scoresMap.map(square); console.log(resultWithEach) // undefined console.log(resultWithMap) // [4, 16, 64, 256, 1024]
map是一個純函數(shù),而forEach則執(zhí)行一些更改:
console.log(newScores) // [4, 16, 64, 256, 1024]
在我看來,map傾向于函數(shù)式編程范例。與forEach不同的是,我們并不總是需要執(zhí)行一次更改來獲得想要的結(jié)果,在forEach中,我們需要對newscore變量進行更改。在每次運行時,當(dāng)提供相同的輸入時,map函數(shù)將產(chǎn)生相同的結(jié)果。同時,forEach對應(yīng)項將從最后一次更改的前一個值中獲取數(shù)據(jù)。
鏈式
map可以使用鏈式操作,因為map返回的結(jié)果是一個數(shù)組。因此,可以立即對結(jié)果調(diào)用任何其他數(shù)組方法。換句話說,我們可以調(diào)用filter, reduce, some等等。對于forEach,這是不可能的,因為返回的值是undefined。
性能
map 方法的性能往往優(yōu)于forEach方法。
檢查用map和forEach實現(xiàn)的等效代碼塊的性能。平均而言,map函數(shù)的執(zhí)行速度至少要快50%。
注意:此基準測試取決于你使用的計算機以及瀏覽器的實現(xiàn)。
在上面討論的所有循環(huán)結(jié)構(gòu)中,為我們提供最多控制的是for..of的循環(huán)。我們可以將它與關(guān)鍵字return、continue和break一起使用。這意味著我們可以指定我們希望對數(shù)組中的每個元素發(fā)生什么,以及我們是想早點離開還是跳過。
上述內(nèi)容就是JavaScript中循環(huán)之間的技術(shù)差異是怎樣的,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
網(wǎng)站標(biāo)題:JavaScript中循環(huán)之間的技術(shù)差異是怎樣的
文章來源:http://jinyejixie.com/article6/psehog.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供關(guān)鍵詞優(yōu)化、動態(tài)網(wǎng)站、云服務(wù)器、搜索引擎優(yōu)化、做網(wǎng)站、網(wǎng)站維護
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)