LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開(kāi)發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

js循環(huán)結(jié)構(gòu)注意事項(xiàng)

freeflydom
2025年6月4日 8:37 本文熱度 777

循環(huán)作為 算法與數(shù)據(jù)結(jié)構(gòu) 中的基石,JS 與其他編程語(yǔ)言一樣,都提供了多種循環(huán)結(jié)構(gòu)用于處理數(shù)據(jù)。

for 循環(huán)

事物的開(kāi)端往往都是從最常用的開(kāi)始,循環(huán)結(jié)構(gòu)咱們從 for 循環(huán)說(shuō)起。

語(yǔ)法:

for (初始化; 條件; 增量) {
  // ...
}

示例:

// 增量每次 +1
for (let i = 0; i < 10; i++) {
  console.log(i);
}
// 增量每次 +2
for (let i = 0; i < 10; i += 2) {
  console.log(i);
}

性能優(yōu)化:

在使用 for 循環(huán)遍歷數(shù)組的時(shí)候,可以提前緩存數(shù)組長(zhǎng)度,減少 length 的訪問(wèn)次數(shù)。

const arr = ['前', '端', '路', '引'];
// 提前使用 len 緩存數(shù)組長(zhǎng)度
for (let i = 0, len = arr.length; i < len; i++) {
  console.log(arr[i]);
}

此示例中使用了 let 同時(shí)聲明了多個(gè)變量,在常規(guī)的代碼編寫(xiě)中,不建議這么使用,但在循環(huán)體這種特殊情況下,這么寫(xiě)也能接受。

// 同時(shí)聲明多個(gè)變量
let a = '前端路引', b = 2, c = true;

增量不一定要使用 i++ 自增,也可以使用 i-- 遞減,或者使用 i += 2 步進(jìn),甚至可以是 i += 10

for in 循環(huán)

ES6 規(guī)范出現(xiàn)之前,只能使用 for in 循環(huán)遍歷對(duì)象,但這哥們有個(gè)坑,不止會(huì)遍歷對(duì)象自身屬性,還能遍歷原型鏈上可枚舉屬性。

const obj1 = {
  name: '前端路引', 
  age: 1,
  'favorite-color': 'red', 
}
for (let key in obj1) {
  console.log(key, obj1[key]);
}
/*
// 輸出結(jié)果
name 前端路引
age 1
favorite-color red
*/

看個(gè)遍歷原型鏈例子:

// 如果有兄弟不小心給對(duì)象的原型鏈上填了一筆
Object.prototype.test = '我是原型鏈上的測(cè)試屬性';
const obj1 = {
  name: '前端路引', 
  age: 1,
  'favorite-color': 'red', 
}
for (let key in obj1) {
  console.log(key, obj1[key]);
}
/*
// 輸出結(jié)果
name 前端路引
age 1
favorite-color red
test 我是原型鏈上的測(cè)試屬性
*/
for (const key in obj1) {
  if (obj.hasOwnProperty(key)) {  // 過(guò)濾掉原型鏈屬性
    console.log(key, obj1[key]);
  }
}
/*
// 輸出結(jié)果
name 前端路引
age 1
favorite-color red
*/

如上所示,代碼編寫(xiě)規(guī)范建議不要對(duì) JS 自身的原型鏈做修改,擴(kuò)展原型鏈雖然方便了一些對(duì)象操作,但實(shí)際上這是埋了雷的,不知道啥時(shí)候就會(huì)引爆!!

在使用 for in 循環(huán)也需要注意原型鏈的屬性,必須使用 hasOwnProperty 方法來(lái)過(guò)濾掉原型鏈上的屬性。

for of 循環(huán)

由于 for in 的各種弊端,后來(lái)定規(guī)范的大佬們,就新增了一個(gè) for of 循環(huán)用于遍歷可迭代對(duì)象,比如:數(shù)組、字符串、Set、Map 等等。

const obj1 = {
  name: '前端路引', 
  age: 1,
  'favorite-color': 'red', 
}
// for of 循環(huán)
for (let [key, value] of Object.entries(obj1)) {
  console.log(key, value);
}
/* // 以上 let [key, value] 使用了 解構(gòu)賦值,其代碼等于
for (let item of Object.entries(obj1)) {
  const [key, value] = item;
  console.log(key, value);
}
// 又等于
for (let item of Object.entries(obj1)) {
  const key = item[0];
  const value = item[1];
  console.log(key, value);
}
*/

for of 無(wú)法直接遍歷對(duì)象,需要遍歷對(duì)象時(shí),需使用內(nèi)置方法 Object.entries 將對(duì)象轉(zhuǎn)為數(shù)組,再使用 for of 遍歷,或者使用 Object.keys/Object.values 將對(duì)象轉(zhuǎn)為鍵/值數(shù)組再遍歷。

相比于 for in 循環(huán),for of 循環(huán)性能更好,也不用考慮原型鏈問(wèn)題。

while 循環(huán)

while 循環(huán)多用于不確定循環(huán)次數(shù)的應(yīng)用場(chǎng)景,比如讀取文件數(shù)據(jù)流,并不知道需要循環(huán)多少次才能讀取完。

let i = 0;
while (i < 3) {
  console.log(i);
  i++;
}

一般能用 for 循環(huán)的場(chǎng)景,都能使用 while 循環(huán)替代。

do while 循環(huán)

這個(gè)循環(huán)可有意思了,不管條件是否滿(mǎn)足,都會(huì)先跑一次循環(huán)體,再判斷條件。

應(yīng)用場(chǎng)景例子:必須讓用戶(hù)先輸入,再判斷條件,直到輸入正確才繼續(xù)。

let userInput;
do {
  userInput = prompt("請(qǐng)輸入一個(gè)大于 10 的數(shù)字:");
} while (isNaN(userInput) || Number(userInput) <= 10);
console.log("有效輸入:", userInput);

死循環(huán)

在使用循環(huán)遍歷時(shí)候,需特別注意 死循環(huán) 問(wèn)題,條件處理不好,就進(jìn)入死循環(huán),導(dǎo)致程序崩潰。

比如:

let i = 0;
while (i < 3) {
  console.log(i);
  // i++; // 忘記修改 i 的值,導(dǎo)致進(jìn)入死循環(huán)
}

善用退出循環(huán)

continue / break / return 三個(gè)關(guān)鍵字都可以用來(lái)處理循環(huán)邏輯,不同的是:

  • continue:跳過(guò)當(dāng)前循環(huán),繼續(xù)下一次循環(huán)。
  • break:跳出當(dāng)前循環(huán),不再繼續(xù)循環(huán)。
  • return:跳出當(dāng)前函數(shù),不再繼續(xù)執(zhí)行。

continue 示例:

function loop1 () {
  for (let i = 0; i < 10; i++) {
    if (i % 2 === 0) {
      continue; // 跳過(guò)偶數(shù)次循環(huán),只輸出奇數(shù)次循環(huán)
    }
    console.log(i); // 輸出 1 3 5 7 9
  }
  console.log('循環(huán)結(jié)束'); // 會(huì)執(zhí)行
}
loop1()

break 示例:

function loop2 () {
  for (let i = 0; i < 10; i++) {
    if (i === 5) {
      break; // 在第 6 次循環(huán)退出
    }
    console.log(i); // 輸出 0 1 2 3 4
  }
  console.log('循環(huán)結(jié)束'); // 會(huì)執(zhí)行
}
loop2()

return 示例:

function loop3 () {
  for (let i = 0; i < 10; i++) {
    if (i === 5) {
      return; // 在第 6 次循環(huán)退出函數(shù),不會(huì)執(zhí)行循環(huán)體后面的代碼
    }
    console.log(i); // 輸出 0 1 2 3 4
  }
  console.log('循環(huán)結(jié)束'); // 此行代碼不會(huì)執(zhí)行
}
loop3()

三個(gè)退出循環(huán)關(guān)鍵字都可以用于所有的循環(huán)語(yǔ)句,不要局限于 for 循環(huán)~~

寫(xiě)在最后

如果說(shuō)算法是程序的靈魂,那么循環(huán)可以算是算法的基石,很多常見(jiàn)的算法都需要使用循環(huán)實(shí)現(xiàn),比如各種數(shù)組排序算法、查找算法、最短路徑算法等等。

循環(huán)是程序中的必修課,任何編程語(yǔ)言都有它的身影。

轉(zhuǎn)自https://www.cnblogs.com/linx/p/18908725


該文章在 2025/6/4 8:37:25 編輯過(guò)
關(guān)鍵字查詢(xún)
相關(guān)文章
正在查詢(xún)...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專(zhuān)業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國(guó)內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車(chē)隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開(kāi)發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類(lèi)企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉(cāng)儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷(xiāo)售管理,采購(gòu)管理,倉(cāng)儲(chǔ)管理,倉(cāng)庫(kù)管理,保質(zhì)期管理,貨位管理,庫(kù)位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶(hù)的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved

黄频国产免费高清视频,久久不卡精品中文字幕一区,激情五月天AV电影在线观看,欧美国产韩国日本一区二区
一区二区三区四区视频在线 | 中文字幕制服丝袜一区二区 | 尤物国产区精品视频 | 日韩精品免费一区二区亚州V日韩 | 亚洲综合久久综合网 | 日韩中文字幕第一页 |