JavaScript 各種遍歷方式詳解,有你不知道的黑科技

2021-02-18 全棧開發者中心

  為了方便例子講解,現有數組和json對象如下:

var demoArr = ['Javascript', 'Gulp', 'CSS3', 'Grunt', 'jQuery', 'angular'];var demoObj = { aaa: 'Javascript', bbb: 'Gulp', ccc: 'CSS3', ddd: 'Grunt', eee: 'jQuery', fff: 'angular'};

  for

  可以直接看示例,用得太多了,很簡單

(function() { for(var i=0, len=demoArr.length; i<len; i++) { if (i == 2) { // return; // 函數執行被終止 // break; // 循環被終止 continue; // 循環被跳過 }; console.log('demo1Arr['+ i +']:' + demo1Arr[i]);}})();

  關於for循環,有一下幾點需要注意

var i = 0, len = demo1Arr.length;for(; i<len; i++) {};

跳出循環的方式有如下幾種

return 函數執行被終止

break 循環被終止

continue 循環被跳過

  完整實例

  for in

  for(var item in arr|obj){} 可以用於遍歷數組和對象

(function() { for(var i in demoArr) { if (i == 2) { return; // 函數執行被終止 // break; // 循環被終止 // continue; // 循環被跳過 }; console.log('demoArr['+ i +']:' + demoArr[i]);}console.log('---');})();

  關於for in,有以下幾點需要注意:

function res() { var demoArr = ['Javascript', 'Gulp', 'CSS3', 'Grunt', 'jQuery', 'angular']; for(var item in demoArr) { if (item == 2) { return; }; console.log(item, demoArr[item]); } console.log('desc', 'function res'); //不會執行}

  forEach

  demoArr.forEach(function(arg) {})

  參數arg表示數組每一項的元素,實例如下

demoArr.forEach(function(e) { if (e == 'CSS3') { return; // 循環被跳過 // break; // 報錯 // continue;// 報錯 }; console.log(e);})

  具體有以下需要注意的地方

  do/while

  函數具體的實現方式如下,不過有一點值得注意的是,當使用continue時,如果你將i++放在了後面,那麼i++的值將一直不會改變,最後陷入死循環。因此使用do/while一定要小心謹慎一點。

不建議使用do/while的方式來遍歷數組

// 直接使用while(function() { var i = 0, len = demoArr.length; while(i < len) { if (i == 2) { // return; // 函數執行被終止 // break; // 循環被終止 // continue; // 循環將被跳過,因為後邊的代碼無法執行,i的值沒有改變,因此循環會一直卡在這裡,慎用!! }; console.log('demoArr['+ i +']:' + demoArr[i]); i ++;}console.log('----');})();// do while(function() { var i = 0, len = demo3Arr.length; do { if (i == 2) { break; // 循環被終止 }; console.log('demo2Arr['+ i +']:' + demo3Arr[i]); i++; } while(i<len);})();

  $.each

  $.each(demoArr|demoObj, function(e, ele))

  可以用來遍歷數組和對象,其中e表示索引值或者key值,ele表示value值

$.each(demoArr, function(e, ele) { console.log(e, ele);})

  輸出為

0 "Javascript"1 "Gulp"2 "CSS3"3 "Grunt"4 "jQuery"5 "angular"

  這裡有很多需要注意的地方

console.log(this);//String {0: "C", 1: "S", 2: "S", 3: "3", length: 4, [[PrimitiveValue]]: "CSS3"}console.log(this == ele);// true

$.each(this, function(e, ele) { console.log(e, ele);})// 0 c// 1 s// 2 s// 4 3

為什麼length 和 [[PrimitiveValue]]沒有遍歷出來?突然靈光一動,在《javascript高級編程》中找到了答案,大概意思就是javascript的內部屬性中,將對象數據屬性中的Enumerable設置為了false

// 查看length的內部屬性console.log(Object.getOwnPropertyDescriptor(this, 'length'));// Object {value: 4, writable: false, enumerable: false, configurable: false}

$.each 中的 $(this) 與this有所不同,不過遍歷結果卻是一樣,你可以在測試代碼中列印出來看看

  $(selecter).each

  專門用來遍歷DOMList

$('.list li').each(function(i, ele) { console.log(i, ele); // console.log(this == ele); // true $(this).html(i); if ($(this).attr('data-item') == 'do') { $(this).html('data-item: do'); };})

  使用for in 遍歷DOMList

  因為domList並非數組,而是一個對象,只是因為其key值為0,1,2... 而感覺與數組類似,但是直接遍歷的結果如下

var domList = document.getElementsByClassName('its');for(var item in domList) { console.log(item, ':' + domList[item]);}// 0: <li></li>// 1: <li></li>// ...// length: 5// item: function item() {}// namedItem: function namedItem() {}

  因此我們在使用for in 遍歷domList時,需要將domList轉換為數組

var res = [].slice.call(domList);for(var item in res) {}

類似這樣的對象還有函數的屬性arguments對象,當然字符串也是可以遍歷的,但是因為字符串其他屬性的enumerable被設置成了false,因此遍歷出來的結果跟數組是一樣的,也就不用擔心這個問題了.

  小補充

  如果你發現有些人寫函數這樣搞,不要驚慌,也不要覺得他高大上鳥不起

+function(ROOT, Struct, undefined) { ... }(window, function() { function Person() {}})

()(), !function() {}() +function() {}() 三種函數自執行的方式^_^

  via:http://segmentfault.com/a/1190000003968126

相關焦點

  • JS幾種數組遍歷方式總結
    ,以下介紹幾種本文分析用到的數組遍歷方式以及進行性能分析對比第一種:普通for循環for(j = 0; j < arr.length; j++) { }簡要說明:最簡單的一種,也是使用頻率最高的一種,雖然性能不弱,但仍有優化空間第二種:優化版for循環for(j
  • 新特性for-of循環,讓javascript程序語言重獲超強生命力
    因而,為適應各種計算機應用場景需要,各具特色的程式語言應運而生,為計算機的發展,作出了不可磨滅的貢獻。而每種有超強生命力的程式語言,都是在工業應用中不斷完善發展的。作為前端編程的主流程式語言,javascript語言也不例外。在javascript程序語言,新增特性for-of循環,讓循環更加簡潔直接,功能更加豐富多樣。
  • 有關樹遍歷的javascript實現【前端-總結-leetcode算法題】
    在這裡插入圖片描述前言二月的第一天,總結一下近段時間刷的有關樹遍歷的leetcode算法題,希望寫完這篇文章的我和看完文章的你都有些收穫吧。全篇主要講的是有關樹的遍歷,使用前端javascript語言實現。當然有關樹的操作還有很多需要的深入理解和總結的。今天就暫時先把樹遍歷理解全吧。
  • JavaScript 中的遍歷
    for…in: 遍歷對象自身的和繼承的可枚舉屬性(不含 Symbol 類型的屬性for ( let key in obj ) {      console.log( key );      console.log( obj.key );          console.log( obj[key] );
  • 你應該知道25道JavaScript面試題
    可以參考我以前翻譯的一篇文章 詳解javascript立即執行函數表達式(IIFE)五What is the significance, and what are the benefits, of including 『use strict』 at the beginning of a JavaScript
  • 最強大、最牛逼的javascript視頻免費發布啦
    本視頻教程相當於基本javascript的書籍的結晶《javascript高級程序設計》《javascript權威指南》《javascript徵途》《javascript王者歸來》、《javascript設計與模式》、《javascript編程精講》希望以此來提高你的javascript水平,以此來讓你更加精通javascript,體會javascript編程之美!!!
  • 你必須要知道的JavaScript數據結構與面試題解答
    也許你只是從數據結構入手,或者你已經編碼多年,只需要複習一下。今天,我們將帶你了解JS開發人員都需要知道的7個JavaScript數據結構。高層數據結構是用於存儲和組織數據的技術,這些數據使修改,導航和訪問變得更加容易。數據結構決定了如何收集數據,我們可以用來訪問數據的功能以及數據之間的關係。數據結構幾乎用於計算機科學和編程的所有領域,從作業系統到基本的編碼再到人工智慧。
  • 詳解Python遍歷列表時刪除元素的正確做法
    這篇文章主要介紹了詳解Python遍歷列表時刪除元素的正確做法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值
  • JavaScript Loop教程–如何在JavaScript中遍歷數組
    無論您是剛剛開始學習JavaScript還是在這裡學習複習,任何一種方式都將為您帶來價值。本文將引導您完成使用最廣泛的JavaScript概念之一。什麼是數組?上面是一個用於存儲多個值的JavaScript數組。這是數組的最簡單形式之一。它在數組內部包含4個「元素」,所有字符串。
  • 20個常用的JavaScript簡寫技巧
    賦默認值 我們可以使用 OR(||) 短路運算來給一個變量賦默認值,如果預期值不正確的情況下。 5. 與 (&&) 短路運算 如果你只有當某個變量為 true 時調用一個函數,那麼你可以使用短路形式書寫。
  • 你不知道的16條JavaScript調試技巧
    該代碼不會像您的實際代碼那樣有用-但至少您可以看到正在發生的事情。單擊檢查器中源查看器下方的{}漂亮列印按鈕。比方說,你要設置一個斷點在function.The兩種最常見的方式做到這一點是:1.找到你檢查線路,並添加一個斷點2.在腳本中添加調試器在這兩種解決方案,您必須手動瀏覽文件以隔離要調試的特定行。可能不太常見的是使用控制臺。
  • 你知道哪些汽車用品的黑科技?您車上有哪些黑科技?
    隨著社會的進步文明的發展,科技帶給世界的變化,超乎我們所有人的想像,各種不可思議的黑科技也慢慢的走進了大眾的生活。汽車行業也不例外,今天咱們來盤點下汽車的黑科技,看看您的愛車上都有了嗎?可以使用手機啟動汽車,可以與車內電子設備語音對話,下車不按鎖車鍵汽車自動上鎖。現在的社會越來越向著智能化的方向發展,其中以手機為代表的個人用品智能特徵尤其明顯。最近幾年隨著科技的發展,人們對汽車的智能化也提出了新要求,有些設想已經付諸實際,下面一起來看看汽車上的智能用品都有哪些,你是否都聽說過?
  • 你不知道的另一面 固特異的黑科技究竟有多驚豔
    網易汽車12月12日報導在你的印象中,固特異是家什麼企業?肯定是輪胎企業!但是你們知道嗎,固特異還有它的另一面。作為一個擁有120多年歷史的輪胎製造商,固特異憑藉其行業尖端技術以及在產品性能方面的出眾實力,早已成為在全球家喻戶曉的輪胎品牌。但是你們知道嗎?
  • 詳解Python字典的複製與遍歷
    本篇介紹Python中字典的複製與遍歷。文中會討論字典的淺複製與深複製的區別,字典的遍歷方法和方式。通過本篇的學習,可以了解字典淺複製與深複製的區別,掌握字典遍歷的方法和方式。1、字典的複製Python字典提供了內置函數copy方法,實現對字典的複製操作。
  • 使用jQuery的prev()、prevAll()和prevUntil()向上遍歷同胞元素
    ,可以向上級遍歷祖先、也可以向下遍歷子孫,當然還可以平行遍歷同胞。在使用jQuery遍歷同胞時,可以遍歷上一個同胞,也可以遍歷下一個同胞。使用jQuery中的prev()方法可以遍歷當前所選元素的上一個同胞元素,也就是平行級別上面的同胞元素。prev()方法只能獲取同級別的上一個Html元素,並且是不包含當前被選Html元素的。
  • 明日方舟黑屬性詳解 黑獲取方式
    明日方舟新活動火藍之心開啟,新幹員黑怎麼樣呢?黑怎麼獲得?今天小編就為大家帶來了黑詳解及獲取方式,各位玩家千萬不要錯過呀!
  • JavaScript 基礎:「47」JavaScript 語言中 parseInt 函數用法詳解
    歡迎關注路條編程網站,本專題主要介紹 JavaScript 基本語法、注釋、變量聲名、各種運算符、字符串、數組及條件語句等。
  • HashMap 的 7 種遍歷方式與性能分析!
    ,但是好心的網友卻發現了一個問題,他說「測試時使用了 sout 列印信息會導致測試的結果不準確,因為這樣測試的話,大部分的性能消耗其實來源於信息列印」,我細想了一下,說的確實有道理,於是我就重寫了測試部分的代碼。
  • JavaScript中Array方法的正確打開方式
    但是,如果回調函數只能返回一個元素,那麼我就不推薦使用這個方法,例如使用回調函數來過濾唯一 ID。在這種情況下,Array.filter 將返回一個只包含一個元素的新數組。我們的意圖可能是通過查找特定的 ID 找到數組中包含的唯一值。我們來看看這個方法的性能。要返回與回調函數匹配的所有元素,Array.filter 必須遍歷整個數組。
  • 什麼是JavaScript對象?如何創建並引用?這就告訴你!
    ps:JavaScript的保留字可以不加引號直接當作對象的屬性。3.2關於鍵值鍵值是屬性所對應的具體的值。javascript的對象的鍵值可以是任何數據類型。四、對象的引用(重點)4.1 對象屬性的讀取和設置讀取對象的屬性,有兩種方法:一種是使用點運算符(.),還有一種是使用方括號運算符([])。