🤝 免罵聲明:
- 本文
列表遍歷操作經本蜀黎實戰整理,旨在提供快速參考指南📝- 因各語言版本迭代及不同系統
環境差異,偶爾可能出現整理不全面之處,實屬正常✅- 歡迎理性交流補充,噴子勿噴——畢竟你行你上來寫,我敬你是條漢子,告訴我的你原文鏈接,我給你一鍵三連+轉發👍!
- 若遇具體問題,請帶圖評論區留言,本蜀黎必拔碼相助🤝
JS列表遍歷深坑跟面試高頻和生產環境息息相關🚀
此篇看似簡單實則大小深坑很多,且學且珍惜,避免踩雷💥
🌟【前言:字符串築基·列表通脈】
「🧠 相信經過前18篇的『字符串苦修』,諸位已掌握:
- 切片如『柔拳點穴』般精準✅
- 格式化如『陰陽遁術』般靈活🚀
- 編碼解碼如『通靈契約』般通透🌈
- 今日起,我們將以字符串為『查克拉根基』💎
- 開啓它的終極形態——列表、元組、字典、集合!💪
這便好比:
- 識百草(字符串)→ 配藥方(列表)🌿
- 通經脈(基礎操作)→ 運氣血(嵌套結構)🍀
- 練體術(單數據類型)→ 結印忍術(多數據組合)✅
**❌字符串基礎紮實者,學列表如履平地;
跳過字符串直接學列表者,必遭『數據反噬』!**
🌿【虎山CTO·藥材使用警示】
- 🍀是藥
三分毒,代碼亦如方! - ❌文中所涉藥材均為技術隱喻,嚴禁實際配伍使用。
- 🙏真實用藥請遵醫囑,亂用者——
- 系統崩壞事小,氣血逆流事大!⚠️
📚 系列文章預告:
- 近期內容將聚焦編程基礎構建,以
「原創知識矩陣」形式系統梳理核心概念。每篇如連續劇集般環環相扣,建議按順序學習——知識點一鍋端,療效更持久!🔥
🧠【場景還原:忍者學校的遍歷特訓】
⚡ 雷影老闆(拍桌怒吼):
- 「💢所有部門本週必須完成
數據巡檢!遍歷不達標的中午給老子手寫《火影鏈表心經》100遍!」
🦊 鳴人(抱頭慘叫):
- 「伊魯卡老師救命!for循環和
enumerate()到底啥區別啊?!為什麼Python能直接拿索引,Java非要讓我get(i)?!😫」
👨🏫 伊魯卡(粉筆頭精準命中):
- 鳴人!
遍歷就像吃一樂拉麪——🍜 - 直接吃
(for-in)→ 享受每一口原湯🍲 - 數着吃
(enumerate)→ 知道第幾口吃到叉燒🍥 - 帶着條件吃
(if-in)→ 避開你不愛的筍乾!🎯
🐯 卡卡西(懶洋洋舉《親熱天堂》補刀):
- 「嘖...連
遍歷都搞不定,以後怎麼跟我學雷切·多線程之術?」
🧘【扎馬步·列表遍歷心法】
- 遍歷如抓藥,方法不對容易君臣
錯位——🔁 直接遍歷值→ 按方抓藥(快速但不知位置)🌿枚舉遍歷→ 帶編號抓藥(精準定位每味)📍條件遍歷→ 配伍禁忌檢測(安全高效)⚠️
📜【四語言列表遍歷對比表】
| 遍歷方式 | Python | JavaScript | Go | Java |
|---|---|---|---|---|
| 直接遍歷值 | for item in list: |
for (let item of list) |
for _, item := range list |
for (String item : list) |
| 枚舉遍歷 | for i, item in enumerate(list): |
for (let [i, item] of list.entries()) |
for i, item := range list |
for (int i=0; i<list.size(); i++) |
| 條件檢測 | if "x" in list: |
if (list.includes("x")) |
需手動實現 contains() |
if (list.contains("x")) |
| 索引從1開始 | enumerate(list, start=1) |
手動 i+1 | 手動 i+1 | 手動 i+1 |
✅核心差異解析:
- Python:
enumerate()封神,一鍵索引+值,支持起始偏移 🏆 - JavaScript:
for...of+entries()優雅但需解構,includes()直白檢測 🎨 - Go:
range統一天下,但無內置包含檢查,需自寫contains()⚡ - Java:傳統
for-loop扛把子,.contains()省心但索引需手動+1 🥋
⚠️【避坑指南·遍歷界的“藥性相沖”】
🚫 Python:勿在遍歷中修改列表長度(否則爆RuntimeError)
hd = ["山楂","麥芽"]
for i, item in enumerate(hd):
hd.pop(i) # 💥 邊遍歷邊刪除,直接炸爐!
💥 JavaScript:for-in遍歷數組有風險(可能遍歷原型鏈)
const hd = ["山楂","麥芽"];
for (let index in hd) {
console.log(index); // 可能輸出非數字鍵!🕳️
}
// 安全用法:for-of 或 for(let i=0; ...)
⚡ Go:range返回的是副本(修改需用索引)
hd := []string{"山楂","麥芽"}
for _, item := range hd {
item = "雷影" // ❌ 無效!item是副本
}
// 正確:for i := range hd { hd[i] = "雷影" }
💣 Java:用增強for循環時不能刪除元素(拋ConcurrentModificationException)
List<String> hd = new ArrayList<>(Arrays.asList("山楂","麥芽"));
for (String item : hd) {
hd.remove(item); // 💥 併發修改異常!
}
// 安全:用Iterator或普通for-loop
⚠️其他小坑提示:
🐍【Python的坑:遍歷中修改列表】
hd = ["山楂", "麥芽", "神曲"]
for index, item in enumerate(hd):
if item == "麥芽":
hd.pop(index) # 💥 直接炸!RuntimeError
# 列表長度變了,enumerate會錯亂
✅ 正確做法:
# 方法1:新建列表
new_hd = [item for item in hd if item != "麥芽"]
# 方法2:倒序遍歷
for i in range(len(hd)-1, -1, -1):
if hd[i] == "麥芽":
hd.pop(i)
⚡【Go的坑:range返回的是副本】
hd := []string{"山楂", "麥芽"}
for _, item := range hd {
item = "雷影" // ❌ 無效!修改的是副本
}
fmt.Println(hd) // 還是["山楂", "麥芽"]
✅ 正確做法:
for i := range hd {
hd[i] = "雷影" // ✅ 通過索引修改
}
☕【Java的坑:增強for循環中刪除】
List<String> hd = new ArrayList<>(Arrays.asList("山楂", "麥芽"));
for (String item : hd) {
if ("麥芽".equals(item)) {
hd.remove(item); // 💥 ConcurrentModificationException
}
}
✅ 正確做法:
// 方法1:用Iterator
Iterator<String> it = hd.iterator();
while (it.hasNext()) {
if ("麥芽".equals(it.next())) {
it.remove(); // ✅ 安全刪除
}
}
// 方法2:用普通for循環
for (int i = 0; i < hd.size(); i++) {
if ("麥芽".equals(hd.get(i))) {
hd.remove(i);
i--; // 索引回退
}
}
| 語言 | 主要坑點 | 安全方案 | 比喻 |
|---|---|---|---|
| JavaScript | for-in 遍歷原型鏈 |
用 for-of 或 forEach |
數藥櫃連説明書一起數 |
| Python | 遍歷中修改列表長度 | 新建列表或倒序遍歷 | 邊煎藥邊加藥材→炸鍋 |
| Go | range 返回副本 |
通過索引修改原值 | 隔空點穴→力道不足 |
| Java | 增強 for 中刪除元素 |
用 Iterator 或普通 for |
拔罐時硬扯→傷皮肉 |
⚠️其他JS大坑提示:
🔥【特殊情況示例:原型鏈污染導致的異常遍歷】
// 情況1:給Array原型添加方法(常見於第三方庫或老代碼)
Array.prototype.中藥特性 = function() { return "性平味甘"; }
const hd = ["山楂", "麥芽"];
console.log("🚨 危險遍歷 for-in:");
for (let index in hd) {
console.log(index); // 輸出:0, 1, 中藥特性 💥
}
console.log("✅ 安全遍歷 for-of:");
for (let item of hd) {
console.log(item); // 輸出:山楂, 麥芽 ✅
}
💥 輸出結果,我遍歷的是值,怎麼成索引了?
🚨 危險遍歷 for-in:
0
1
中藥特性 // 💥 意外多出來的非數字鍵!
✅ 安全遍歷 for-of:
山楂
麥芽
🛡️【企業級避坑指南】
// ✅ 安全做法1:永遠用for-of遍歷數組
for (const item of array) { /* 安全 */ }
// ✅ 安全做法2:用forEach
array.forEach((item, index) => { /* 安全 */ })
// ✅ 安全做法3:用普通for循環
for (let i = 0; i < array.length; i++) { /* 安全 */ }
// 🚫 危險做法:用for-in遍歷數組
for (const index in array) { /* 可能踩坑 */ }
🧠【更隱蔽的死坑場景】
// 情況2:Object.defineProperty 定義不可枚舉屬性
Object.defineProperty(Array.prototype, "隱藏屬性", {
value: "我是原型鏈上的幽靈",
enumerable: false // 不可枚舉,但某些情況下仍可能被遍歷
});
輸出:
情況2:Object.defineProperty 定義不可枚舉屬性
0 山楂
1 麥芽
中藥特性 [Function (anonymous)]
為什麼設置了不可枚舉限制,還在生效中❌
✅正確做法:
// 先清空原型鏈,再測試
delete Array.prototype.中藥特性; // 🧹 先清理
// 只設置不可枚舉屬性
Object.defineProperty(Array.prototype, "隱藏屬性", {
value: "我是原型鏈上的幽靈",
enumerable: false
});
const hd = ["山楂", "麥芽"];
console.log("🚨 測試不可枚舉屬性:");
for (let index in hd) {
console.log(index); // 應該只輸出:0, 1 ✅
}
// 驗證屬性確實存在但不可枚舉
console.log("隱藏屬性" in hd); // true
console.log(hd.hasOwnProperty("隱藏屬性")); // false
console.log(Object.keys(hd)); // ["0", "1"]
以下是本蜀黎整理源碼和截圖⏬
JS避坑源碼和正確處理方法:
// 情況1:給Array原型添加方法(常見於第三方庫或老代碼)
Array.prototype.中藥特性 = function() { return "性平味甘"; }
const hd = ["山楂", "麥芽"];
console.log("🚨 危險遍歷 for-in:");
for (let index in hd) {
console.log(index); // 輸出:0, 1, 中藥特性 💥
}
console.log("✅ 安全遍歷 for-of:");
for (let item of hd) {
console.log(item); // 輸出:山楂, 麥芽 ✅
}
console.log("\n方法1,2,3輸出")
// 方法1:使用 hasOwnProperty 過濾
for (let index in hd) {
if (hd.hasOwnProperty(index)) {
console.log(index, hd[index]); // 只輸出自有屬性
}
}
// 方法2:直接用 for-of(ES6推薦)
for (let item of hd) {
console.log(item);
}
// 方法3:傳統 for 循環
for (let i = 0; i < hd.length; i++) {
console.log(i, hd[i]);
}
// 情況2:Object.defineProperty 定義不可枚舉屬性
Object.defineProperty(Array.prototype, "隱藏屬性", {
value: "我是原型鏈上的幽靈",
enumerable: false // 不可枚舉,但某些情況下仍可能被遍歷
});
const hd1 = ["山楂", "麥芽"];
console.log("\n情況2:Object.defineProperty 定義不可枚舉屬性")
// 某些JS引擎或特殊模式下可能出現問題
for (let index in hd1) {
console.log(index, hd1[index]);
}
正確處理生效方法:
// 先清空原型鏈,再測試
delete Array.prototype.中藥特性; // 🧹 先清理
// 只設置不可枚舉屬性
Object.defineProperty(Array.prototype, "隱藏屬性", {
value: "我是原型鏈上的幽靈",
enumerable: false
});
const hd = ["山楂", "麥芽"];
console.log("🚨 測試不可枚舉屬性:");
for (let index in hd) {
console.log(index); // 應該只輸出:0, 1 ✅
}
// 驗證屬性確實存在但不可枚舉
console.log("隱藏屬性" in hd); // true
console.log(hd.hasOwnProperty("隱藏屬性")); // false
console.log(Object.keys(hd)); // ["0", "1"]
1.Python源碼⏬
# ==================== 財務遍歷模塊 ====================
# 帶序號查賬:給每個科目發工牌 👔
# 條件觸發審計:發現異常金額立即鎖賬 🔒
# ⚠️ERP_冷溪虎山:遍歷中斷會導致對賬失敗
hd = ['山楂','神曲','麥芽','谷芽','雞矢藤','雞內金','蜘蛛香','沙棘'] #消化藥 列表
for index,item in enumerate(hd): #索引默認從0開始
print(f"索引{index}-{item}")
print("🗝️🗝️🗝️🗝️🗝️🗝️🗝️🗝️🗝️")
for index,item in enumerate(hd,1): #索引從1開始
print(f"索引{index}-{item}")
print("🗝️🗝️🗝️🗝️🗝️🗝️🗝️🗝️🗝️")
if "山楂" in hd: #條件
for value in hd: #遍歷值
print(value)
for i in range(len(hd)): #遍歷索引
print(i)
def lengxi_tiger(chapter):
print(f"""
🍵【Python虎山寶寶專屬提醒】🍵
老鐵,你已經肝完 {chapter} 章啦!
快起來活動下頸椎,接杯熱水~
你是我的心頭肉,別累壞了!(๑•̀ㅂ•́)و✧
別讓本座_冷溪tiger操心
""")
lengxi_tiger(10)
2.Nodejs源碼⏬
// ==================== 中藥遍歷模塊 ====================
// 帶編號驗方:給每味藥材發身份牌 🪪
// 君臣配伍檢測:發現相剋立即報警 ⚠️
// ⚠️虎山老藥師:遍歷錯誤會炸爐
const hd = ['山楂', '神曲', '麥芽', '谷芽', '雞矢藤', '雞內金', '蜘蛛香', '沙棘']; // 消化藥列表
// 索引默認從0開始
console.log("🗝️🗝️🗝️🗝️🗝️🗝️🗝️🗝️");
for (const [index, item] of hd.entries()) {
console.log(`索引${index}-${item}`);
}
console.log("🗝️🗝️🗝️🗝️🗝️🗝️🗝️🗝️");
// 索引從1開始
for (let i = 0; i < hd.length; i++) {
console.log(`索引${i + 1}-${hd[i]}`);
}
console.log("🗝️🗝️🗝️🗝️🗝️🗝️🗝️🗝️");
if (hd.includes("山楂")) { // 條件判斷
// 遍歷值
for (const value of hd) {
console.log(value);
}
// 遍歷索引
for (let i = 0; i < hd.length; i++) {
console.log(i);
}
}
function lengxiTiger(chapter) {
console.log(`%c
🥤【JS小可愛注意】🥤
你已經征服了 ${chapter} 個章節!
快站起來扭扭腰,眨眨眼~
本座_lengxi心疼你的肝啊!(っ◕‿◕)っ
`, "color: #FF69B4; font-size: 14px");
}
// 每10章調用
lengxiTiger(10);
3.Go源碼⏬
package main
import "fmt"
// ==================== 倉儲遍歷模塊 ====================
// 帶位置盤點:給每件貨物貼座標籤 🏷️
// 臨期檢測:過期商品自動亮紅燈 🚨
// ⚠️冷溪物流:遍歷卡頓會堵死傳送帶
func main() {
hd := []string{"山楂", "神曲", "麥芽", "谷芽", "雞矢藤", "雞內金", "蜘蛛香", "沙棘"} // 消化藥列表
// 索引默認從0開始
fmt.Println("🗝️🗝️🗝️🗝️🗝️🗝️🗝️🗝️")
for index, item := range hd {
fmt.Printf("索引%d-%s\n", index, item)
}
fmt.Println("🗝️🗝️🗝️🗝️🗝️🗝️🗝️🗝️")
// 索引從1開始
for i := 0; i < len(hd); i++ {
fmt.Printf("索引%d-%s\n", i+1, hd[i])
}
fmt.Println("🗝️🗝️🗝️🗝️🗝️🗝️🗝️🗝️")
if contains(hd, "山楂") { // 條件判斷
// 遍歷值
for _, value := range hd {
fmt.Println(value)
}
// 遍歷索引
for i := 0; i < len(hd); i++ {
fmt.Println(i)
}
}
//防疲勞警示
HushanTiter10(10)
}
// Go 沒有內置的 contains 函數,需要手動實現
func contains(slice []string, item string) bool {
for _, s := range slice {
if s == item {
return true
}
}
return false
}
func HushanTiter10(chapter int) {
fmt.Printf(`
🚨【Go語言戰士注意】🚨
你已經持續戰鬥%d個章節!
--------------------------
執行以下命令:
$ 起身拉伸
$ 補充水分
$ 對鏡子誇自己帥
--------------------------
你可是本項目的稀缺資源!
本座巴不得把我畢生所學全部傳授你們_冷溪友好提示
`, chapter)
}
4.Java源碼⏬
import java.util.Arrays;
import java.util.List;
// ==================== ERP遍歷模塊 ====================
// 帶索引巡檢:給每筆業務打條形碼 📊
// 異常流程攔截:觸發條件立即暫停審批 ⏸️
// ⚠️ERP老兵_冷溪虎山:死循環會燒燬CPU
class main20 {
public static void main(String[] args) {
List<String> hd = Arrays.asList("山楂", "神曲", "麥芽", "谷芽", "雞矢藤", "雞內金", "蜘蛛香", "沙棘"); // 消化藥列表
// 索引默認從0開始
System.out.println("🗝️🗝️🗝️🗝️🗝️🗝️🗝️🗝️");
for (int i = 0; i < hd.size(); i++) {
System.out.println("索引" + i + "-" + hd.get(i));
}
System.out.println("🗝️🗝️🗝️🗝️🗝️🗝️🗝️🗝️");
// 索引從1開始
for (int i = 0; i < hd.size(); i++) {
System.out.println("索引" + (i + 1) + "-" + hd.get(i));
}
System.out.println("🗝️🗝️🗝️🗝️🗝️🗝️🗝️🗝️");
if (hd.contains("山楂")) { // 條件判斷
// 遍歷值
for (String value : hd) {
System.out.println(value);
}
// 遍歷索引
for (int i = 0; i < hd.size(); i++) {
System.out.println(i);
}
LengxiHushan20.remind(10);
}
}
}
class LengxiHushan20 {
public static void remind(int chapter) {
System.out.println(
"\n☕【Java老中醫lengxitiger關愛提示】☕\n" +
"您已連續學習" + chapter + "個章節!\n" +
"建議:\n" +
"1. 做10個深蹲\n" +
"2. 遠眺窗外6米外\n" +
"3. 對本虎山和自己説聲'我超棒'\n" +
"注意:你的頭髮是本項目重要資產!\n"
);
}
}
源碼分享結束⏫
📜【結局:遍歷之道·全員通關】
⚡ 雷影老闆(盯着整齊的遍歷代碼目瞪口呆):
- 「🏆這...這遍歷比我的雷遁·查克拉模式還流暢!全員加班費翻倍——但必須學會
四語言遍歷,否則年終獎扣去修雷影辦公室的牆!」
🌸 雛田(小聲對鳴人説):
- 「鳴人...下次用
enumerate時記得起始索引設為1...就像藥方裏的君藥必須排第一位...🥇」
🦊 鳴人(舉着拉麪碗蹦起來):
- 「哈哈哈!原來
遍歷就是數着叉燒吃麪!我會了!佐助——來比誰先遍歷完一樂菜單!🍜」
🐯 卡卡西(默默合上《親熱天堂》):
- 「嗯...總算有點樣子了。下次教你們用
遞歸遍歷破解幻術·樹結構數據...📙」
💥 佐助(寫輪眼微閃):
- 「🎨哼...吊車尾的,等你能用Go手動實現
contains()再説吧。」
🐯【虎山CTO的終極暴論】
遍歷的本質是數據經絡巡行——🔎直接遍歷如氣血奔涌(簡單但易失控)🔍枚舉遍歷如點穴精準(君臣有位,索引有序)🔮條件遍歷如辨證施治(避禁忌,保平安)🎁
**❌ 死記API不如參透思想:
所有語言遍歷皆為循環造化,不過語法結印不同罷了!**
**編程如用藥,切忌胡亂循環——
該for-range時別用for-i,該枚舉時別硬寫下標+1!**
🧪【附:四語言遍歷心法口訣】
Python:
enumerate起手式,索引值兒一對出🏆
JavaScript:
for-of配entries,解構是絕活🥇
Go:
range橫掃一切,但須自寫contains🥈
Java:
- 老牌
for-loop穩,.contains()省心神🥉
⚠️ 免責聲明(附因果律警告)
本代碼已注入中醫玄學能量,請謹慎使用:
-
✅ 允許白嫖,但白嫖不點贊可能導致:
- 下次面試官恰好問到這個算法
- 鍵盤自動打出
//這裏感謝冷溪虎山CTO - 奶茶精準灑在剛寫好的代碼上
-
✅ 允許商用轉發,但商用不註明出處可能觸發:
- 系統類型混亂自動轉型
- 數據庫莫名存儲"君臣佐使"字段
-
✅ 允許吐槽,但吐槽不帶改進建議可能引發:
- 終生與老闆N連鞭相愛相殺
🚀 現在立即行動:
- 點贊 → 吸收本篇算法精華+怪蜀黎腦洞思維
- 收藏 → 避免日後求醫無門
- 關注 → 接收更多「中醫+代碼」腦洞
- 評論區留言 → 領取你的專屬「算法藥方」
⚠️ 友情提示:
- 本文內容過於硬核,建議點贊收藏轉發三連,避免小編
心情波動導致文章神秘消失! - 畢竟小編今天可能愛答不理,明天可能高攀不起——
-
但你的收藏夾,永遠是你最穩的知識備份!
🐶💻 (小聲説:關我小黑屋?不存在的,備份早已同步GitHub/公眾號/網盤!)
📚 往期爆文推薦,VIP輪換解鎖:
📖Python/JS/Go/Java四語言同步學習,跨語言系列上線(別在糾結學什麼單語言了)
🔍 沒看過前傳?快補課!
前1-18篇請移步至"PY-JS-GO-JAVA基礎進階學習系列"合集中閲讀
- Python/JS/Go/Java同步學習(第十九篇)四語言“列表相關操作“對照表: 雷影“老闆“發飆要求員工下班留校培訓風暴(附源碼/截圖/參數表/避坑指南)
- Python/JS/Go/Java同步學習(第十八篇)四語言“常用時間類型格式化“對照表: 財務“小南“紙式格式化術處理憑證內容崩潰(附源碼/截圖/參數表/避坑指南)
- Python/JS/Go/Java同步學習(第十篇)四語言“字符串去空格“對照表: 雷影老闆下達清除“數據污垢“指令(附源碼/截圖/參數表/避坑指南)