LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

JavaScript這些陷阱坑了多少開發者

admin
2025年2月10日 14:43 本文熱度 108
JavaScript 作為一門靈活但歷史包袱較重的語言,存在不少容易導致錯誤的“陷阱,本文分享10個JavaScript陷阱。

1. 變量提升(Hoisting)


  • 現象:使用 var 聲明的變量會提升到作用域頂部(但賦值不會提升)。

  • 陷阱:變量在聲明前使用會得到 undefined,而非報錯。

  • ?console.log(a); // undefined,而不是報錯var a = 10;



2. 隱式類型轉換


  • 現象== 運算符會觸發隱式類型轉換,而 === 不會。

  • 陷阱:一些看似合理的比較會得到反直覺的結果。

    console.log(0 == "0");    // trueconsole.log(0 == []);     // trueconsole.log([] == ![]);   // true(![] 轉換為 false,再比較 [] == false)



3. 作用域與閉包


  • 陷阱:循環中使用 var 可能導致閉包捕獲同一個變量。

    for (var i = 0; i < 3; i++) {  setTimeout(() => console.log(i), 100); // 輸出 3, 3, 3}// 解決:改用 let 或閉包隔離作用域。



4. this 的指向問題


  • 現象:普通函數中的 this 由調用方式決定,箭頭函數繼承外層 this。

  • 陷阱:方法調用時可能丟失 this

    const obj = {  value: 42,  getValue: function() { return this.value; },  getValueArrow: () => this.value // 此處 this 指向全局對象(如 window)};console.log(obj.getValue());      // 42console.log(obj.getValueArrow()); // undefined(嚴格模式下報錯)



5. 異步與事件循環


  • 陷阱setTimeout 的延遲不精確,回調函數會在主線程空閑后執行。

    console.log("Start");setTimeout(() => console.log("Timeout"), 0);Promise.resolve().then(() => console.log("Promise"));console.log("End");// 輸出順序:Start → End → Promise → Timeout(微任務優先于宏任務)



6. NaN 的奇怪行為


  • 現象NaN(Not a Number)與任何值(包括自身)比較均為 false。

    console.log(NaN === NaN); // falseconsole.log(isNaN("Hello")); // true(字符串被隱式轉換為 NaN)console.log(Number.isNaN("Hello")); // false(更安全的檢查)



7. 數組與對象的“陷阱”


  • 現象:數組的 typeof 返回 "object",空數組的布爾轉換是 true。

    console.log(typeof []); // "object"console.log([] == false); // true([] 轉換為 0,false 轉換為 0)console.log([] === false); // false



8. 浮點數精度問題


  • 現象:JavaScript 使用 IEEE 754 雙精度浮點數,可能導致精度丟失。

    console.log(0.1 + 0.2 === 0.3); // falseconsole.log(0.1 + 0.2); // 0.30000000000000004



9. 自動分號插入(ASI)


  • 陷阱:某些情況下換行會被插入分號,導致意外結果。

    function foo() {  return     { a: 1 }; // 實際返回 undefined,因為分號被插入在 return 后}



10. 原型鏈污染


  • 現象:修改內置對象原型會影響所有實例。

    Array.prototype.push = () => "Hacked!";const arr = [];console.log(arr.push(1)); // 輸出 "Hacked!"



如何規避陷阱?


  1. 使用 "use strict"; 嚴格模式。

  2. 優先使用 === 和 !==。

  3. 用 let 和 const 替代 var。

  4. 理解異步模型(Promise/Async Await)。

  5. 使用現代工具(如 TypeScript、ESLint)規避常見錯誤。


JavaScript 的靈活性既是優勢也是風險,深入理解其機制是避免陷阱的關鍵。


該文章在 2025/2/10 14:43:14 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved

黄频国产免费高清视频,久久不卡精品中文字幕一区,激情五月天AV电影在线观看,欧美国产韩国日本一区二区
久草免费福利资源站在线观看 | 亚洲中文字幕乱码第二 | 久久97精品久久久久久久不卡 | 午夜福利精品在线 | 亚洲福利精品一区二区三区 | 亚洲夜夜性夜综合久久 |