Stories

Detail Return Return

Python/JS/Go/Java同步學習(第二十篇)四語言“列表遍歷“對照表

🤝 免罵聲明:
  • 本文列表遍歷操作經本蜀黎實戰整理,旨在提供快速參考指南📝
  • 因各語言版本迭代及不同系統環境差異,偶爾可能出現整理不全面之處,實屬正常✅
  • 歡迎理性交流補充,噴子勿噴——畢竟你行你上來寫,我敬你是條漢子,告訴我的你原文鏈接,我給你一鍵三連+轉發👍!
  • 若遇具體問題,請帶圖評論區留言,本蜀黎必拔碼相助🤝
    土味海報

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-offorEach 數藥櫃連説明書一起數
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]);
}

避坑1

正確處理生效方法:

// 先清空原型鏈,再測試
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"]

避坑2

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)

Python

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);

nodejs

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)
}

go

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"
        );
    }
}

Java

源碼分享結束⏫

📜【結局:遍歷之道·全員通關】

⚡ 雷影老闆(盯着整齊的遍歷代碼目瞪口呆):
  • 「🏆這...這遍歷比我的雷遁·查克拉模式還流暢!全員加班費翻倍——但必須學會四語言遍歷,否則年終獎扣去修雷影辦公室的牆!」
🌸 雛田(小聲對鳴人説):
  • 「鳴人...下次用enumerate時記得起始索引設為1...就像藥方裏的君藥必須排第一位...🥇」
🦊 鳴人(舉着拉麪碗蹦起來):
  • 「哈哈哈!原來遍歷就是數着叉燒吃麪!我會了!佐助——來比誰先遍歷完一樂菜單!🍜」
🐯 卡卡西(默默合上《親熱天堂》):
  • 「嗯...總算有點樣子了。下次教你們用遞歸遍歷破解幻術·樹結構數據...📙」
💥 佐助(寫輪眼微閃):
  • 「🎨哼...吊車尾的,等你能用Go手動實現contains()再説吧。」
🐯【虎山CTO的終極暴論】
  • 遍歷的本質是數據經絡巡行——🔎
  • 直接遍歷如氣血奔涌(簡單但易失控)🔍
  • 枚舉遍歷如點穴精準(君臣有位,索引有序)🔮
  • 條件遍歷如辨證施治(避禁忌,保平安)🎁

**❌ 死記API不如參透思想:
所有語言遍歷皆為循環造化,不過語法結印不同罷了!**

**編程如用藥,切忌胡亂循環——
for-range時別用for-i,該枚舉時別硬寫下標+1!**

🧪【附:四語言遍歷心法口訣】

Python:

  • enumerate 起手式,索引值兒一對出🏆

JavaScript:

  • for-ofentries,解構是絕活🥇

Go:

  • range 橫掃一切,但須自寫 contains🥈

Java:

  • 老牌 for-loop 穩,.contains() 省心神🥉

⚠️ 免責聲明(附因果律警告)

本代碼已注入中醫玄學能量,請謹慎使用:

  • ✅ 允許白嫖,但白嫖不點贊可能導致:

    • 下次面試官恰好問到這個算法
    • 鍵盤自動打出//這裏感謝冷溪虎山CTO
    • 奶茶精準灑在剛寫好的代碼上
  • ✅ 允許商用轉發,但商用不註明出處可能觸發:

    • 系統類型混亂自動轉型
    • 數據庫莫名存儲"君臣佐使"字段
  • ✅ 允許吐槽,但吐槽不帶改進建議可能引發:

    • 終生與老闆N連鞭相愛相殺

🚀 現在立即行動:

  1. 點贊 → 吸收本篇算法精華+怪蜀黎腦洞思維
  2. 收藏 → 避免日後求醫無門
  3. 關注 → 接收更多「中醫+代碼」腦洞
  4. 評論區留言 → 領取你的專屬「算法藥方」

⚠️ 友情提示:

  • 本文內容過於硬核,建議點贊收藏轉發三連,避免小編心情波動導致文章神秘消失
  • 畢竟小編今天可能愛答不理,明天可能高攀不起——
  • 但你的收藏夾,永遠是你最穩的知識備份!

    🐶💻 (小聲説:關我小黑屋?不存在的,備份早已同步GitHub/公眾號/網盤!)

📚 往期爆文推薦,VIP輪換解鎖:

📖Python/JS/Go/Java四語言同步學習,跨語言系列上線(別在糾結學什麼單語言了)

🔍 沒看過前傳?快補課!
1-18篇請移步至"PY-JS-GO-JAVA基礎進階學習系列"合集中閲讀

  • Python/JS/Go/Java同步學習(第十九篇)四語言“列表相關操作“對照表: 雷影“老闆“發飆要求員工下班留校培訓風暴(附源碼/截圖/參數表/避坑指南)
  • Python/JS/Go/Java同步學習(第十八篇)四語言“常用時間類型格式化“對照表: 財務“小南“紙式格式化術處理憑證內容崩潰(附源碼/截圖/參數表/避坑指南)
  • Python/JS/Go/Java同步學習(第十篇)四語言“字符串去空格“對照表: 雷影老闆下達清除“數據污垢“指令(附源碼/截圖/參數表/避坑指南)
user avatar
0 users favorite the story!

Post Comments

Some HTML is okay.