js中的循環與跳出

2020-12-06 左道前端

在日常工作中經常遇到需要跳出當前循環的場景,但是每次查詢過後沒多久就忘記了,循環時也是使用map一把梭,趁著休息,在這裡總結一下js中的循環方法以及如何跳出當前循環。

本文略去了一些方法的傳入參數以及返回參數,做了一些精簡,如果需要詳細了解方法的使用可以去MDN上詳細查詢。

for循環

基本結構:for(表達式一;表達式二;表達式三){}表達式一 用來定義變量表達式二 用來判斷循環是否結束表達式三 每次循環都要執行的表達式{} 代碼塊

常規用法

for(let i=1;i<5;i++){console.log(i)}輸出:1234

省略表達式一

let i =1;for(;i<5;i++){console.log(i)}輸出:1234

省略表達式二

for (let i = 1;; i++) {if (i == 3) {break;}console.log(i)}輸出:12

省略代碼塊

let i = 1;for(;i<3;i++);console.log(i);輸出:2

跳出循環

continue跳出本次循環

for(let i=1;i<5;i++){if(i===2){continue;}console.log(i)}輸出134

跳出所有:

return跳出所有循環

function test(){for(let i=1;i<5;i++){if(i===2){return}console.log(i)}}test()輸出:1

return 必須出現在函數體內,否則會出現語法錯誤:Uncaught SyntaxError: Illegal return statement

break跳出所有循環

for(let i=1;i<5;i++){if(i===2){break;}console.log(i)}輸出:1

for in

一般用來遍歷對象的屬性,不建議用來遍歷數組

let obj = {name:'小明',sex:'男',adress:'中國'};function Parent(){this.age = 11;}Parent.prototype = obj;let son = new Parent();for(let key in son){console.log(key)}輸出:namesexadressage

遍歷對象時會連同繼承來的屬性一併循環出來,如果只需要遍歷自身屬性,則需要使用hasOwnProperty方法

let obj = {name:'小明',sex:'男',adress:'中國'};function Parent(){this.age = 11;}Parent.prototype = obj;let son = new Parent();for(let key in son){if(son.hasOwnProperty(key)){console.log(key)}}輸出age

跳出循環:

continue跳出本次循環

let obj = {name:'小明',sex:'男',adress:'中國'};functiontest(){for(let key in obj){if(key == 'sex'){continue}console.log(key)}}test()輸出:nameadress

break跳出所有循環

let obj = {name:'小明',sex:'男',adress:'中國'};for(letkey in obj){if(key == 'sex'){break}console.log(key)}let obj = {name:'小明',sex:'男',adress:'中國'};function test(){for(let key in obj){if(key == 'sex'){return}console.log(key)}}test()

return跳出所有循環

let obj = {name:'小明',sex:'男',adress:'中國'};console.log("開始循環")function test(){for (let key in obj) {console.log(key)return;}}test();console.log("結束循環")輸出:name

return 必須出現在函數體內,否則會出現語法錯誤:Uncaught SyntaxError: Illegal return statement

for of

一般用在可迭代對象上

let arr = ['a','b','c'];for(let value of arr){console.log(value)}輸出:abc

跳出循環

break跳出

let arr = ['a','b','c'];console.log("開始循環")for(let value of arr){console.log(value)break;}console.log("結束循環")輸出開始循環a結束循環

return跳出

let arr = ['a', 'b', 'c'];console.log("開始循環")function test(){for (let value of arr) {console.log(value)return;}}test();console.log("結束循環")

return 必須出現在函數體內,否則會出現語法錯誤:Uncaught SyntaxError: Illegal return statement

continue跳出本次循環

let arr = ['a','b','c']functiontest(){for(let value of arr){if(value == 'b'){continue}console.log(value)}}test()輸出ac

forEach 循環

無返回值

forEach 第一次執行回調時就確定了數組的範圍,循環時新增的值並不會被循環到

let arr = ['a','b','c','d'];arr.forEach((item,index)=>{if(item == 'b'){arr.push('E')}console.log(item)})輸出:abcd

如果在循環中更改了已存在的值,則傳遞給回調的值是遍歷到值的那刻的值

let arr = ['a','b','c','d'];arr.forEach((item,index)=>{if(item == 'b'){arr[2] = 'C';}console.log(item)})輸出:abCd

如果循環中刪除數組中的某項值,傳遞給forEach中的數組為刪除數據後的數組

let arr = ['a','b','c','d'];arr.forEach((item,index)=>{if(item == 'b'){arr.splice(3,1)}console.log(item,index)})輸出:a 0b 1c 2

forEach 只能通過拋出異常來結束循環,如果需要跳出循環建議使用for in、for of、 for、 every 、some 、 find等函數

map

返回值為return後組成的新數組

循環中刪除元素後下次循環接收到的新數組為刪除元素後的數組,當循環到第2個元素時刪除掉第三個元素,循環第三個元素時數組為[20,30,40],index為2,所以輸出40,2,循環完畢後輸出[20,30,40]

let array = [10,20,30,40];array.map((item,index,arr)=>{if(item==20){arr.splice(0,1);}console.log(item,index);});console.log(array);輸出:10 020 140 2[20,30,40]

every

當回調函數返回true時繼續執行循環,當返回false時跳出循環

let arr = [10,20,30,40];arr.every((item,index)=>{console.log(item)return true})輸出:10203040

當空數組調用時,總會返回true

console.log([].every(() => {return false}))輸出:true

跳出循環

let arr = [10,20,30,40];arr.every((item,index)=>{console.log(item)if(item==20){return false}return true})輸出:1020

some

當回調函數返回false時繼續執行循環,當返回true時跳出循環

跳出循環

let arr = [10, 20, 30, 40];arr.some((item, index) => {console.log(item)return false})輸出:10

當空數組調用時,總會返回false

console.log([].some(() => {return true}))輸出:false

filter

返回一個由通過的元素組成的數組

let arr = [1,2,3,4,5]let newArr = arr.filter((item,index)=>{return item>2})console.log(newArr)輸出:345

總結:

循環時需要跳出

for 、for in 、for of 、some 、every

返回新數組

map 、filter 、some 、every

相關焦點

  • python循環控制語句
    循環語句語句後面一定要跟:冒號for循環:1.for…in range()遍歷格式:for i in range(5);或者for i in range( 0,10,3 );格式中的1列印i是從0開始後列印到5結束
  • 微信跳一跳輔助教程,跳出你想要的高分!
    那麼如何才能跳出更高的高分,網上的各種攻略看得眼花繚亂,用下來效果也不好。今日就給大家詳細介紹一種簡單易懂的方法,教你如何用輔助腳本來刷新高分。首先介紹一下遊戲得分規則,跳一個方塊加1分。連續跳到方塊的中心點,得分會翻倍遞增,即2分、4分、6分、8分。在井蓋、魔方、徐記士多便利店和黑膠唱片上停留一段時間後會分別加5分、10分、15分和30分。
  • threeJS——ASCII:實現代碼雨的科幻效果
    在這部影片中, 有一個非常經典的畫面效果對不起, 不是這張, 而是這張叫做代碼雨,大家可以通過百度看一下代碼雨的動態效果。而在電影中,所有的現實中的東西都是由一串串代碼組成的, 比如這樣。今天, 我就要帶領大家製作這樣的效果。這個效果叫做ASCII碼字化效果(文本畫),非常簡單。
  • 使用reveal.js製作精美的網頁版PPT
    接下來我們再看看reveal.js的優勢.reveal.js使介紹以及核心api作為一名前端工程師, 我們很容易把reveal.js集成到我們的vue或者react項目中, 但是作為演講類型的項目,我們直接用最原始的方式實現即可,首先我們需要引入相關的文件,具體可參考官網所說的步驟去做: revealjs.com/.
  • ThingJS:基於WebGL的3D技術在網頁中的運用
    Three.js、ThingJS這些引擎庫可以加載3D製作軟體的模型,大幅度提高了製作效率,改變WebGL開發困難的局面,讓Web開發者享受便捷的3D開發服務。因此,很多3D圖形引擎庫應運而生,直接使用Javascript腳本語言開發,將WebGL進行不同程度的封裝,例如「three js「、「scenceJS」、「Oak3d」和「simjs」等,這些引擎庫能夠讓用戶更加方便地進行3D圖形繪製和動畫的製作。
  • 瀏覽器中實現深度學習?有人分析了7個基於JS語言的DL框架
    TensorFlow.js、Keras.js 和 WebDNN 支持在 Python 中從原生 DL 框架中導入模型,並且它們都提供了用於轉換模型的 Python 腳本。TensorFlow.js 支持由 TensorFlow 和 Keras 訓練的模型。Keras.js 支持 Keras 模型。
  • Vue.js深入學習
    vue.jsv-cloak:解決網速慢閃爍問題 ,不會替換掉標籤裡面的內容v-text:會替換掉標籤裡面的內容:原樣輸出v-html:會解析標籤v-bind:綁定屬性的指令,縮寫,是一個原生的js對象//每當指令綁定到元素上的時候,會立刻執行這個bind函數,只執行一次inserted:function(){//元素插入到dom中的時候,會執行一次update:function(){//當VNode更新的時候,會執行,可能會觸發多次});私有指令:diectives
  • three.js為何如此奇妙
    WebGL是在瀏覽器中實現三維效果的一套規範,而最初使用WebGL原生的API來寫3D程序是一件非常痛苦的事情,在辛苦的付出下WebGL開源框架出現了,其中three.js就是非常優秀的一個,它掩蓋了很多麻煩的細節,那麼,就讓我們一起來看看,什麼是three.js吧!
  • 從Rust到遠方:ASM.js星系
    這篇文章會解釋什麼是ASM.js,怎樣編譯博客解析器到ASM.js以及如何在瀏覽器中和Javascript一起使用ASM.js. 使用ASM.js的目標是當作WebAssembly不可用的備用方案。Emscripten,如上圖所示,是一個在這個Web平臺演進過程中非常重要的一個項目。
  • total.js 2.4.0 發布,Node.js 的 MVC 框架
    total.js 2.4.0 發布了。total.js 是一個 web 應用框架,使用 JavaScript、HTML、CSS 和 Node.js(MVC) web 應用框架來構建 web 網站和 web 應用。
  • 瀏覽器中實現深度學習?有人分析了7個基於JS語言的DL框架,發現還有...
    由於 TensorFlow.js、Keras.js 和 WebDNN 使用的模型文件都是由 Keras 模型轉換而來,所以它們的模型文件大小是一樣的,作者只在表 3 中顯示 TensorFlow.js。由於從 Keras 轉換而來的模型被壓縮後保存為二進位文件,所以大小可以大大縮小,只有 JSON 中模型文件的 1/7 左右。
  • 前端工程化以及如何通過Node.js中babel來編譯es6模塊化代碼
    模塊化就是把單獨的一個功能封裝到一個模塊(文件)中,模塊之間相互隔離,但是可以通過特定的接口公開內部成員,也可以依賴別的模塊模塊化開發的好處:方便代碼的重用,從而提升開發效率,並且方便後期的維護一開始模塊化規範有哪些?
  • VUE與JS的對比
    我們需要讓所有綁定的對象和元素都能感知到變化1.1.1. vue與js的對比1.1.1.1. js的實現(了解)<!引入js文件--><script src="..vue是一個構建用戶界面的框架(庫),它的目標是通過儘可能簡單的api實現響應的數據綁定和組合的視圖集合 vue自身不是一個全能框架的核心是只關注視圖層,因此它非常容易學習,非常容易與其它庫或已有項目整合 vue在與相關工具和支持庫一起使用時, 也能完美地驅動複雜的單頁應用,在之後的課程中,
  • Angular、React 當前,Vue.js 優劣幾何?
    2019 更是熱度不減,而作為近年來尤為熱門的前端框架,Vue.js 自是積累了大量關注。那麼,Vue.js 是適合你的框架嗎?作者 |Tim Han譯者 | 蘇本如責編 | 仲培藝以下為譯文:對於大多數人來說,現在要構建一個新的前端應用,對框架/庫的選擇在很大程度上都是在 Angular 和 React 中二選一。
  • Node.js 開發者們都在做什麼?
    大約有三分之二的人向我們聲稱在他們的應用中使用了MongoDB。同樣值得關注的是Redis在有經驗的Node.js開發者中的受歡迎程度在快速的增長,PostgreSQL/ElasticSearch也有著同樣的增長趨勢。
  • 手寫動態 3D 蛛網圖 | THREE.js
    最後選擇用 THREE.js 實現主體,用 DOM 實現控制項和交互。Hacking THREE—之前 ��解析《自然》 雜誌 150 年論文可視化作品 中,提到過這個庫。THREE.js 基於 WebGL,前身是廣泛用於 3D 遊戲的 OpenGL。
  • JS+jQuery+qrcode.js實現前端生成二維碼
    position": "absolute", "left": "50%" }); } $(document).on('click', '#createQR', function () { createQR(); })</script>外部代碼引用:<script src="qrcode.min.js
  • Deno需要做什麼才能取代Node.js?
    Deno需要做什麼才能取代Node.js? 為什麼Deno正式版本1.0發行時沒能成功呢?本文就將深入探討這個問題。什麼是DenoDeno是由Ryan Dahl(也是Node.js的原創者)創建的安全的JavaScript和TypeScript運行時,它的創建是為了彌補2009年首次設計Node.js時的疏忽。這種出發點很有意義,我敢肯定每個程式設計師都希望有機會重寫他們10年前的代碼。
  • js14s時間繼電器接線圖
    打開APP js14s時間繼電器接線圖 姚遠香 發表於 2018-10-21 09:17:59   js14s時間繼電器   JS14S系列時間繼電器適用於交流50Hz,額定控制電源電壓至380V及直流控制電源電壓至240V的控制電路中作延時元件,按預定的時間接通或分斷電路。
  • total.js 1.9.0 發布,Node.js 的 MVC 框架
    added: @{nocompress html}, @{nocompress js}, @{nocompress css}, @{nocompress all}added: req.authorize(callback(err, userprofile, isAuthorized))added: res.content(code, body, type,