[{"data":1,"prerenderedAt":4229},["ShallowReactive",2],{"page-\u002Fjs\u002F04-control-flow":3},{"id":4,"title":5,"body":6,"description":4222,"extension":4223,"meta":4224,"navigation":56,"path":4225,"seo":4226,"stem":4227,"__hash__":4228},"content\u002Fjs\u002F04-control-flow.md","JavaScript 04 — Control Flow Internals: Truthiness, Switch Fall-Through & Loop Optimizations",{"type":7,"value":8,"toc":4207},"minimark",[9,14,24,367,374,882,889,1382,1386,2116,2133,2756,2760,3097,3101,3656,3660,4029,4033,4037,4116,4203],[10,11,13],"h1",{"id":12},"_04-control-flow-internals-truthiness-switch-fall-through-loop-optimizations","04 — Control Flow Internals: Truthiness, Switch Fall-Through & Loop Optimizations",[15,16,18,19,23],"h2",{"id":17},"truthiness-the-toboolean-coercion","Truthiness: The ",[20,21,22],"code",{},"ToBoolean"," Coercion",[25,26,28],"code-wrapper",{"language":27},"javascript",[29,30,34],"pre",{"className":31,"code":32,"language":27,"meta":33,"style":33},"language-javascript shiki shiki-themes github-light github-dark","\u002F\u002F ── 8 falsy values (everything else is truthy) ──\n\u002F\u002F false, 0, -0, 0n (BigInt zero), \"\", null, undefined, NaN\n\n\u002F\u002F ── Truthy values that surprise developers from other languages ──\nif ([]) console.log(\"empty array is truthy\");   \u002F\u002F prints! (Python: falsy)\nif ({}) console.log(\"empty object is truthy\");   \u002F\u002F prints! (Python: falsy)\nif (\"0\") console.log(\"string '0' is truthy\");    \u002F\u002F prints! (non-empty string)\nif (\"false\") console.log(\"string 'false' is truthy\");  \u002F\u002F prints! (non-empty string)\nif (Infinity) console.log(\"Infinity is truthy\");  \u002F\u002F prints!\nif (-1) console.log(\"negative numbers are truthy\");  \u002F\u002F prints! (only 0\u002F-0 are falsy)\n\n\u002F\u002F ── Truthiness check via !! (double negation) ──\nconst isTruthy = (val) => !!val;\nconsole.log(isTruthy(0));    \u002F\u002F false\nconsole.log(isTruthy(\"\"));   \u002F\u002F false\nconsole.log(isTruthy([]));   \u002F\u002F true (empty array is truthy!)\nconsole.log(isTruthy(null)); \u002F\u002F false\n\n\u002F\u002F ── Anti-pattern: checking length on a possibly-null array ──\n\u002F\u002F ❌ if (arr && arr.length > 0) — works but verbose\n\u002F\u002F ✅ if (arr?.length > 0) — optional chaining + length truthiness\n\u002F\u002F ✅ if (arr?.length) — even cleaner (length 0 is falsy, >0 is truthy)\n","",[20,35,36,45,51,58,64,92,111,138,162,187,214,219,225,255,279,300,317,338,343,349,355,361],{"__ignoreMap":33},[37,38,41],"span",{"class":39,"line":40},"line",1,[37,42,44],{"class":43},"sdCPZ","\u002F\u002F ── 8 falsy values (everything else is truthy) ──\n",[37,46,48],{"class":39,"line":47},2,[37,49,50],{"class":43},"\u002F\u002F false, 0, -0, 0n (BigInt zero), \"\", null, undefined, NaN\n",[37,52,54],{"class":39,"line":53},3,[37,55,57],{"emptyLinePlaceholder":56},true,"\n",[37,59,61],{"class":39,"line":60},4,[37,62,63],{"class":43},"\u002F\u002F ── Truthy values that surprise developers from other languages ──\n",[37,65,67,71,75,79,82,86,89],{"class":39,"line":66},5,[37,68,70],{"class":69},"svdQ7","if",[37,72,74],{"class":73},"ssxIu"," ([]) console.",[37,76,78],{"class":77},"sIsaT","log",[37,80,81],{"class":73},"(",[37,83,85],{"class":84},"sJ6F3","\"empty array is truthy\"",[37,87,88],{"class":73},");   ",[37,90,91],{"class":43},"\u002F\u002F prints! (Python: falsy)\n",[37,93,95,97,100,102,104,107,109],{"class":39,"line":94},6,[37,96,70],{"class":69},[37,98,99],{"class":73}," ({}) console.",[37,101,78],{"class":77},[37,103,81],{"class":73},[37,105,106],{"class":84},"\"empty object is truthy\"",[37,108,88],{"class":73},[37,110,91],{"class":43},[37,112,114,116,119,122,125,127,129,132,135],{"class":39,"line":113},7,[37,115,70],{"class":69},[37,117,118],{"class":73}," (",[37,120,121],{"class":84},"\"0\"",[37,123,124],{"class":73},") console.",[37,126,78],{"class":77},[37,128,81],{"class":73},[37,130,131],{"class":84},"\"string '0' is truthy\"",[37,133,134],{"class":73},");    ",[37,136,137],{"class":43},"\u002F\u002F prints! (non-empty string)\n",[37,139,141,143,145,148,150,152,154,157,160],{"class":39,"line":140},8,[37,142,70],{"class":69},[37,144,118],{"class":73},[37,146,147],{"class":84},"\"false\"",[37,149,124],{"class":73},[37,151,78],{"class":77},[37,153,81],{"class":73},[37,155,156],{"class":84},"\"string 'false' is truthy\"",[37,158,159],{"class":73},");  ",[37,161,137],{"class":43},[37,163,165,167,169,173,175,177,179,182,184],{"class":39,"line":164},9,[37,166,70],{"class":69},[37,168,118],{"class":73},[37,170,172],{"class":171},"snvgF","Infinity",[37,174,124],{"class":73},[37,176,78],{"class":77},[37,178,81],{"class":73},[37,180,181],{"class":84},"\"Infinity is truthy\"",[37,183,159],{"class":73},[37,185,186],{"class":43},"\u002F\u002F prints!\n",[37,188,190,192,194,197,200,202,204,206,209,211],{"class":39,"line":189},10,[37,191,70],{"class":69},[37,193,118],{"class":73},[37,195,196],{"class":69},"-",[37,198,199],{"class":171},"1",[37,201,124],{"class":73},[37,203,78],{"class":77},[37,205,81],{"class":73},[37,207,208],{"class":84},"\"negative numbers are truthy\"",[37,210,159],{"class":73},[37,212,213],{"class":43},"\u002F\u002F prints! (only 0\u002F-0 are falsy)\n",[37,215,217],{"class":39,"line":216},11,[37,218,57],{"emptyLinePlaceholder":56},[37,220,222],{"class":39,"line":221},12,[37,223,224],{"class":43},"\u002F\u002F ── Truthiness check via !! (double negation) ──\n",[37,226,228,231,234,237,239,243,246,249,252],{"class":39,"line":227},13,[37,229,230],{"class":69},"const",[37,232,233],{"class":77}," isTruthy",[37,235,236],{"class":69}," =",[37,238,118],{"class":73},[37,240,242],{"class":241},"sCrzJ","val",[37,244,245],{"class":73},") ",[37,247,248],{"class":69},"=>",[37,250,251],{"class":69}," !!",[37,253,254],{"class":73},"val;\n",[37,256,258,261,263,265,268,270,273,276],{"class":39,"line":257},14,[37,259,260],{"class":73},"console.",[37,262,78],{"class":77},[37,264,81],{"class":73},[37,266,267],{"class":77},"isTruthy",[37,269,81],{"class":73},[37,271,272],{"class":171},"0",[37,274,275],{"class":73},"));    ",[37,277,278],{"class":43},"\u002F\u002F false\n",[37,280,282,284,286,288,290,292,295,298],{"class":39,"line":281},15,[37,283,260],{"class":73},[37,285,78],{"class":77},[37,287,81],{"class":73},[37,289,267],{"class":77},[37,291,81],{"class":73},[37,293,294],{"class":84},"\"\"",[37,296,297],{"class":73},"));   ",[37,299,278],{"class":43},[37,301,303,305,307,309,311,314],{"class":39,"line":302},16,[37,304,260],{"class":73},[37,306,78],{"class":77},[37,308,81],{"class":73},[37,310,267],{"class":77},[37,312,313],{"class":73},"([]));   ",[37,315,316],{"class":43},"\u002F\u002F true (empty array is truthy!)\n",[37,318,320,322,324,326,328,330,333,336],{"class":39,"line":319},17,[37,321,260],{"class":73},[37,323,78],{"class":77},[37,325,81],{"class":73},[37,327,267],{"class":77},[37,329,81],{"class":73},[37,331,332],{"class":171},"null",[37,334,335],{"class":73},")); ",[37,337,278],{"class":43},[37,339,341],{"class":39,"line":340},18,[37,342,57],{"emptyLinePlaceholder":56},[37,344,346],{"class":39,"line":345},19,[37,347,348],{"class":43},"\u002F\u002F ── Anti-pattern: checking length on a possibly-null array ──\n",[37,350,352],{"class":39,"line":351},20,[37,353,354],{"class":43},"\u002F\u002F ❌ if (arr && arr.length > 0) — works but verbose\n",[37,356,358],{"class":39,"line":357},21,[37,359,360],{"class":43},"\u002F\u002F ✅ if (arr?.length > 0) — optional chaining + length truthiness\n",[37,362,364],{"class":39,"line":363},22,[37,365,366],{"class":43},"\u002F\u002F ✅ if (arr?.length) — even cleaner (length 0 is falsy, >0 is truthy)\n",[15,368,370,373],{"id":369},"switch-strict-equality-and-fall-through",[20,371,372],{},"switch",": Strict Equality and Fall-Through",[25,375,376],{"language":27},[29,377,379],{"className":31,"code":378,"language":27,"meta":33,"style":33},"\u002F\u002F ── switch uses STRICT equality (===) — no coercion ──\nswitch (\"1\") {\n    case 1: console.log(\"number 1\"); break;   \u002F\u002F NOT matched (string !== number)\n    case \"1\": console.log(\"string '1'\"); break;  \u002F\u002F matched (===)\n}\n\u002F\u002F Output: string '1'\n\n\u002F\u002F ── Fall-through: without `break`, execution continues to the next case ──\nswitch (2) {\n    case 1: console.log(\"one\");\n    \u002F\u002F falls through (no break)\n    case 2: console.log(\"two\");\n    \u002F\u002F falls through (no break)\n    case 3: console.log(\"three\");\n    break;  \u002F\u002F stops here\n    case 4: console.log(\"four\");  \u002F\u002F skipped\n}\n\u002F\u002F Output: two, three\n\n\u002F\u002F ── Intentional fall-through (grouping cases) ──\nfunction getDayType(day) {\n    switch (day) {\n        case \"Saturday\":\n        case \"Sunday\":      \u002F\u002F both fall through to the same body\n            return \"weekend\";\n        case \"Monday\":\n        case \"Tuesday\":\n        case \"Wednesday\":\n        case \"Thursday\":\n        case \"Friday\":\n            return \"weekday\";\n        default:\n            return \"invalid\";\n    }\n}\n\u002F\u002F This is the ONE acceptable use of fall-through (empty case bodies grouped together)\n\n\u002F\u002F ── Anti-pattern: accidental fall-through (forgetting break) ──\n\u002F\u002F ❌ DANGEROUS — missing break causes unintended fall-through\nfunction getStatus(code) {\n    switch (code) {\n        case 200: return \"OK\";     \u002F\u002F has return — no fall-through (return exits)\n        case 404: console.log(\"not found\");  \u002F\u002F no break, no return — FALLS THROUGH!\n        case 500: return \"error\";  \u002F\u002F 404 falls through to here → returns \"error\"!\n    }\n}\ngetStatus(404);  \u002F\u002F \"error\" (logs \"not found\", then falls through to return \"error\")\n",[20,380,381,386,398,428,454,459,464,468,473,484,502,507,525,529,547,557,578,582,587,591,596,611,619,631,645,657,667,677,687,697,707,717,725,735,741,746,752,757,763,769,783,791,814,836,856,861,866],{"__ignoreMap":33},[37,382,383],{"class":39,"line":40},[37,384,385],{"class":43},"\u002F\u002F ── switch uses STRICT equality (===) — no coercion ──\n",[37,387,388,390,392,395],{"class":39,"line":47},[37,389,372],{"class":69},[37,391,118],{"class":73},[37,393,394],{"class":84},"\"1\"",[37,396,397],{"class":73},") {\n",[37,399,400,403,406,409,411,413,416,419,422,425],{"class":39,"line":53},[37,401,402],{"class":69},"    case",[37,404,405],{"class":171}," 1",[37,407,408],{"class":73},": console.",[37,410,78],{"class":77},[37,412,81],{"class":73},[37,414,415],{"class":84},"\"number 1\"",[37,417,418],{"class":73},"); ",[37,420,421],{"class":69},"break",[37,423,424],{"class":73},";   ",[37,426,427],{"class":43},"\u002F\u002F NOT matched (string !== number)\n",[37,429,430,432,435,437,439,441,444,446,448,451],{"class":39,"line":60},[37,431,402],{"class":69},[37,433,434],{"class":84}," \"1\"",[37,436,408],{"class":73},[37,438,78],{"class":77},[37,440,81],{"class":73},[37,442,443],{"class":84},"\"string '1'\"",[37,445,418],{"class":73},[37,447,421],{"class":69},[37,449,450],{"class":73},";  ",[37,452,453],{"class":43},"\u002F\u002F matched (===)\n",[37,455,456],{"class":39,"line":66},[37,457,458],{"class":73},"}\n",[37,460,461],{"class":39,"line":94},[37,462,463],{"class":43},"\u002F\u002F Output: string '1'\n",[37,465,466],{"class":39,"line":113},[37,467,57],{"emptyLinePlaceholder":56},[37,469,470],{"class":39,"line":140},[37,471,472],{"class":43},"\u002F\u002F ── Fall-through: without `break`, execution continues to the next case ──\n",[37,474,475,477,479,482],{"class":39,"line":164},[37,476,372],{"class":69},[37,478,118],{"class":73},[37,480,481],{"class":171},"2",[37,483,397],{"class":73},[37,485,486,488,490,492,494,496,499],{"class":39,"line":189},[37,487,402],{"class":69},[37,489,405],{"class":171},[37,491,408],{"class":73},[37,493,78],{"class":77},[37,495,81],{"class":73},[37,497,498],{"class":84},"\"one\"",[37,500,501],{"class":73},");\n",[37,503,504],{"class":39,"line":216},[37,505,506],{"class":43},"    \u002F\u002F falls through (no break)\n",[37,508,509,511,514,516,518,520,523],{"class":39,"line":221},[37,510,402],{"class":69},[37,512,513],{"class":171}," 2",[37,515,408],{"class":73},[37,517,78],{"class":77},[37,519,81],{"class":73},[37,521,522],{"class":84},"\"two\"",[37,524,501],{"class":73},[37,526,527],{"class":39,"line":227},[37,528,506],{"class":43},[37,530,531,533,536,538,540,542,545],{"class":39,"line":257},[37,532,402],{"class":69},[37,534,535],{"class":171}," 3",[37,537,408],{"class":73},[37,539,78],{"class":77},[37,541,81],{"class":73},[37,543,544],{"class":84},"\"three\"",[37,546,501],{"class":73},[37,548,549,552,554],{"class":39,"line":281},[37,550,551],{"class":69},"    break",[37,553,450],{"class":73},[37,555,556],{"class":43},"\u002F\u002F stops here\n",[37,558,559,561,564,566,568,570,573,575],{"class":39,"line":302},[37,560,402],{"class":69},[37,562,563],{"class":171}," 4",[37,565,408],{"class":73},[37,567,78],{"class":77},[37,569,81],{"class":73},[37,571,572],{"class":84},"\"four\"",[37,574,159],{"class":73},[37,576,577],{"class":43},"\u002F\u002F skipped\n",[37,579,580],{"class":39,"line":319},[37,581,458],{"class":73},[37,583,584],{"class":39,"line":340},[37,585,586],{"class":43},"\u002F\u002F Output: two, three\n",[37,588,589],{"class":39,"line":345},[37,590,57],{"emptyLinePlaceholder":56},[37,592,593],{"class":39,"line":351},[37,594,595],{"class":43},"\u002F\u002F ── Intentional fall-through (grouping cases) ──\n",[37,597,598,601,604,606,609],{"class":39,"line":357},[37,599,600],{"class":69},"function",[37,602,603],{"class":77}," getDayType",[37,605,81],{"class":73},[37,607,608],{"class":241},"day",[37,610,397],{"class":73},[37,612,613,616],{"class":39,"line":363},[37,614,615],{"class":69},"    switch",[37,617,618],{"class":73}," (day) {\n",[37,620,622,625,628],{"class":39,"line":621},23,[37,623,624],{"class":69},"        case",[37,626,627],{"class":84}," \"Saturday\"",[37,629,630],{"class":73},":\n",[37,632,634,636,639,642],{"class":39,"line":633},24,[37,635,624],{"class":69},[37,637,638],{"class":84}," \"Sunday\"",[37,640,641],{"class":73},":      ",[37,643,644],{"class":43},"\u002F\u002F both fall through to the same body\n",[37,646,648,651,654],{"class":39,"line":647},25,[37,649,650],{"class":69},"            return",[37,652,653],{"class":84}," \"weekend\"",[37,655,656],{"class":73},";\n",[37,658,660,662,665],{"class":39,"line":659},26,[37,661,624],{"class":69},[37,663,664],{"class":84}," \"Monday\"",[37,666,630],{"class":73},[37,668,670,672,675],{"class":39,"line":669},27,[37,671,624],{"class":69},[37,673,674],{"class":84}," \"Tuesday\"",[37,676,630],{"class":73},[37,678,680,682,685],{"class":39,"line":679},28,[37,681,624],{"class":69},[37,683,684],{"class":84}," \"Wednesday\"",[37,686,630],{"class":73},[37,688,690,692,695],{"class":39,"line":689},29,[37,691,624],{"class":69},[37,693,694],{"class":84}," \"Thursday\"",[37,696,630],{"class":73},[37,698,700,702,705],{"class":39,"line":699},30,[37,701,624],{"class":69},[37,703,704],{"class":84}," \"Friday\"",[37,706,630],{"class":73},[37,708,710,712,715],{"class":39,"line":709},31,[37,711,650],{"class":69},[37,713,714],{"class":84}," \"weekday\"",[37,716,656],{"class":73},[37,718,720,723],{"class":39,"line":719},32,[37,721,722],{"class":69},"        default",[37,724,630],{"class":73},[37,726,728,730,733],{"class":39,"line":727},33,[37,729,650],{"class":69},[37,731,732],{"class":84}," \"invalid\"",[37,734,656],{"class":73},[37,736,738],{"class":39,"line":737},34,[37,739,740],{"class":73},"    }\n",[37,742,744],{"class":39,"line":743},35,[37,745,458],{"class":73},[37,747,749],{"class":39,"line":748},36,[37,750,751],{"class":43},"\u002F\u002F This is the ONE acceptable use of fall-through (empty case bodies grouped together)\n",[37,753,755],{"class":39,"line":754},37,[37,756,57],{"emptyLinePlaceholder":56},[37,758,760],{"class":39,"line":759},38,[37,761,762],{"class":43},"\u002F\u002F ── Anti-pattern: accidental fall-through (forgetting break) ──\n",[37,764,766],{"class":39,"line":765},39,[37,767,768],{"class":43},"\u002F\u002F ❌ DANGEROUS — missing break causes unintended fall-through\n",[37,770,772,774,777,779,781],{"class":39,"line":771},40,[37,773,600],{"class":69},[37,775,776],{"class":77}," getStatus",[37,778,81],{"class":73},[37,780,20],{"class":241},[37,782,397],{"class":73},[37,784,786,788],{"class":39,"line":785},41,[37,787,615],{"class":69},[37,789,790],{"class":73}," (code) {\n",[37,792,794,796,799,802,805,808,811],{"class":39,"line":793},42,[37,795,624],{"class":69},[37,797,798],{"class":171}," 200",[37,800,801],{"class":73},": ",[37,803,804],{"class":69},"return",[37,806,807],{"class":84}," \"OK\"",[37,809,810],{"class":73},";     ",[37,812,813],{"class":43},"\u002F\u002F has return — no fall-through (return exits)\n",[37,815,817,819,822,824,826,828,831,833],{"class":39,"line":816},43,[37,818,624],{"class":69},[37,820,821],{"class":171}," 404",[37,823,408],{"class":73},[37,825,78],{"class":77},[37,827,81],{"class":73},[37,829,830],{"class":84},"\"not found\"",[37,832,159],{"class":73},[37,834,835],{"class":43},"\u002F\u002F no break, no return — FALLS THROUGH!\n",[37,837,839,841,844,846,848,851,853],{"class":39,"line":838},44,[37,840,624],{"class":69},[37,842,843],{"class":171}," 500",[37,845,801],{"class":73},[37,847,804],{"class":69},[37,849,850],{"class":84}," \"error\"",[37,852,450],{"class":73},[37,854,855],{"class":43},"\u002F\u002F 404 falls through to here → returns \"error\"!\n",[37,857,859],{"class":39,"line":858},45,[37,860,740],{"class":73},[37,862,864],{"class":39,"line":863},46,[37,865,458],{"class":73},[37,867,869,872,874,877,879],{"class":39,"line":868},47,[37,870,871],{"class":77},"getStatus",[37,873,81],{"class":73},[37,875,876],{"class":171},"404",[37,878,159],{"class":73},[37,880,881],{"class":43},"\u002F\u002F \"error\" (logs \"not found\", then falls through to return \"error\")\n",[15,883,885,886,888],{"id":884},"anti-pattern-switch-vs-object-lookup","Anti-Pattern: ",[20,887,372],{}," vs Object Lookup",[25,890,891],{"language":27},[29,892,894],{"className":31,"code":893,"language":27,"meta":33,"style":33},"\u002F\u002F ❌ NAIVE — switch is verbose, fall-through-prone, hard to maintain\nfunction getHttpStatus(code) {\n    switch (code) {\n        case 200: return \"OK\";\n        case 201: return \"Created\";\n        case 400: return \"Bad Request\";\n        case 401: return \"Unauthorized\";\n        case 404: return \"Not Found\";\n        case 500: return \"Internal Server Error\";\n        default: return \"Unknown\";\n    }\n}\n\n\u002F\u002F ✅ CORRECT — object lookup is cleaner, no fall-through risk, easy to extend\nconst HTTP_STATUS = {\n    200: \"OK\",\n    201: \"Created\",\n    400: \"Bad Request\",\n    401: \"Unauthorized\",\n    404: \"Not Found\",\n    500: \"Internal Server Error\",\n};\nconst getHttpStatus2 = (code) => HTTP_STATUS[code] ?? \"Unknown\";\n\u002F\u002F Object lookup: O(1) property access vs switch's sequential comparison\n\u002F\u002F Also: easy to serialize, iterate, or generate from data\n\n\u002F\u002F ── Object lookup with function values (dispatch table \u002F strategy pattern) ──\nconst handlers = {\n    create: (data) => api.post(\"\u002Fitems\", data),\n    update: (id, data) => api.put(`\u002Fitems\u002F${id}`, data),\n    delete: (id) => api.delete(`\u002Fitems\u002F${id}`),\n    default: () => { throw new Error(\"unknown action\"); },\n};\nfunction dispatch(action, ...args) {\n    const handler = handlers[action] ?? handlers.default;\n    return handler(...args);\n}\n\u002F\u002F dispatch(\"create\", { name: \"Alice\" }) → calls handlers.create(...)\n",[20,895,896,901,914,920,934,950,966,982,997,1012,1025,1029,1033,1037,1042,1054,1067,1079,1091,1103,1115,1127,1132,1161,1166,1171,1175,1180,1191,1220,1256,1285,1315,1319,1341,1359,1373,1377],{"__ignoreMap":33},[37,897,898],{"class":39,"line":40},[37,899,900],{"class":43},"\u002F\u002F ❌ NAIVE — switch is verbose, fall-through-prone, hard to maintain\n",[37,902,903,905,908,910,912],{"class":39,"line":47},[37,904,600],{"class":69},[37,906,907],{"class":77}," getHttpStatus",[37,909,81],{"class":73},[37,911,20],{"class":241},[37,913,397],{"class":73},[37,915,916,918],{"class":39,"line":53},[37,917,615],{"class":69},[37,919,790],{"class":73},[37,921,922,924,926,928,930,932],{"class":39,"line":60},[37,923,624],{"class":69},[37,925,798],{"class":171},[37,927,801],{"class":73},[37,929,804],{"class":69},[37,931,807],{"class":84},[37,933,656],{"class":73},[37,935,936,938,941,943,945,948],{"class":39,"line":66},[37,937,624],{"class":69},[37,939,940],{"class":171}," 201",[37,942,801],{"class":73},[37,944,804],{"class":69},[37,946,947],{"class":84}," \"Created\"",[37,949,656],{"class":73},[37,951,952,954,957,959,961,964],{"class":39,"line":94},[37,953,624],{"class":69},[37,955,956],{"class":171}," 400",[37,958,801],{"class":73},[37,960,804],{"class":69},[37,962,963],{"class":84}," \"Bad Request\"",[37,965,656],{"class":73},[37,967,968,970,973,975,977,980],{"class":39,"line":113},[37,969,624],{"class":69},[37,971,972],{"class":171}," 401",[37,974,801],{"class":73},[37,976,804],{"class":69},[37,978,979],{"class":84}," \"Unauthorized\"",[37,981,656],{"class":73},[37,983,984,986,988,990,992,995],{"class":39,"line":140},[37,985,624],{"class":69},[37,987,821],{"class":171},[37,989,801],{"class":73},[37,991,804],{"class":69},[37,993,994],{"class":84}," \"Not Found\"",[37,996,656],{"class":73},[37,998,999,1001,1003,1005,1007,1010],{"class":39,"line":164},[37,1000,624],{"class":69},[37,1002,843],{"class":171},[37,1004,801],{"class":73},[37,1006,804],{"class":69},[37,1008,1009],{"class":84}," \"Internal Server Error\"",[37,1011,656],{"class":73},[37,1013,1014,1016,1018,1020,1023],{"class":39,"line":189},[37,1015,722],{"class":69},[37,1017,801],{"class":73},[37,1019,804],{"class":69},[37,1021,1022],{"class":84}," \"Unknown\"",[37,1024,656],{"class":73},[37,1026,1027],{"class":39,"line":216},[37,1028,740],{"class":73},[37,1030,1031],{"class":39,"line":221},[37,1032,458],{"class":73},[37,1034,1035],{"class":39,"line":227},[37,1036,57],{"emptyLinePlaceholder":56},[37,1038,1039],{"class":39,"line":257},[37,1040,1041],{"class":43},"\u002F\u002F ✅ CORRECT — object lookup is cleaner, no fall-through risk, easy to extend\n",[37,1043,1044,1046,1049,1051],{"class":39,"line":281},[37,1045,230],{"class":69},[37,1047,1048],{"class":171}," HTTP_STATUS",[37,1050,236],{"class":69},[37,1052,1053],{"class":73}," {\n",[37,1055,1056,1059,1061,1064],{"class":39,"line":302},[37,1057,1058],{"class":171},"    200",[37,1060,801],{"class":73},[37,1062,1063],{"class":84},"\"OK\"",[37,1065,1066],{"class":73},",\n",[37,1068,1069,1072,1074,1077],{"class":39,"line":319},[37,1070,1071],{"class":171},"    201",[37,1073,801],{"class":73},[37,1075,1076],{"class":84},"\"Created\"",[37,1078,1066],{"class":73},[37,1080,1081,1084,1086,1089],{"class":39,"line":340},[37,1082,1083],{"class":171},"    400",[37,1085,801],{"class":73},[37,1087,1088],{"class":84},"\"Bad Request\"",[37,1090,1066],{"class":73},[37,1092,1093,1096,1098,1101],{"class":39,"line":345},[37,1094,1095],{"class":171},"    401",[37,1097,801],{"class":73},[37,1099,1100],{"class":84},"\"Unauthorized\"",[37,1102,1066],{"class":73},[37,1104,1105,1108,1110,1113],{"class":39,"line":351},[37,1106,1107],{"class":171},"    404",[37,1109,801],{"class":73},[37,1111,1112],{"class":84},"\"Not Found\"",[37,1114,1066],{"class":73},[37,1116,1117,1120,1122,1125],{"class":39,"line":357},[37,1118,1119],{"class":171},"    500",[37,1121,801],{"class":73},[37,1123,1124],{"class":84},"\"Internal Server Error\"",[37,1126,1066],{"class":73},[37,1128,1129],{"class":39,"line":363},[37,1130,1131],{"class":73},"};\n",[37,1133,1134,1136,1139,1141,1143,1145,1147,1149,1151,1154,1157,1159],{"class":39,"line":621},[37,1135,230],{"class":69},[37,1137,1138],{"class":77}," getHttpStatus2",[37,1140,236],{"class":69},[37,1142,118],{"class":73},[37,1144,20],{"class":241},[37,1146,245],{"class":73},[37,1148,248],{"class":69},[37,1150,1048],{"class":171},[37,1152,1153],{"class":73},"[code] ",[37,1155,1156],{"class":69},"??",[37,1158,1022],{"class":84},[37,1160,656],{"class":73},[37,1162,1163],{"class":39,"line":633},[37,1164,1165],{"class":43},"\u002F\u002F Object lookup: O(1) property access vs switch's sequential comparison\n",[37,1167,1168],{"class":39,"line":647},[37,1169,1170],{"class":43},"\u002F\u002F Also: easy to serialize, iterate, or generate from data\n",[37,1172,1173],{"class":39,"line":659},[37,1174,57],{"emptyLinePlaceholder":56},[37,1176,1177],{"class":39,"line":669},[37,1178,1179],{"class":43},"\u002F\u002F ── Object lookup with function values (dispatch table \u002F strategy pattern) ──\n",[37,1181,1182,1184,1187,1189],{"class":39,"line":679},[37,1183,230],{"class":69},[37,1185,1186],{"class":171}," handlers",[37,1188,236],{"class":69},[37,1190,1053],{"class":73},[37,1192,1193,1196,1199,1202,1204,1206,1209,1212,1214,1217],{"class":39,"line":689},[37,1194,1195],{"class":77},"    create",[37,1197,1198],{"class":73},": (",[37,1200,1201],{"class":241},"data",[37,1203,245],{"class":73},[37,1205,248],{"class":69},[37,1207,1208],{"class":73}," api.",[37,1210,1211],{"class":77},"post",[37,1213,81],{"class":73},[37,1215,1216],{"class":84},"\"\u002Fitems\"",[37,1218,1219],{"class":73},", data),\n",[37,1221,1222,1225,1227,1230,1233,1235,1237,1239,1241,1244,1246,1249,1251,1254],{"class":39,"line":699},[37,1223,1224],{"class":77},"    update",[37,1226,1198],{"class":73},[37,1228,1229],{"class":241},"id",[37,1231,1232],{"class":73},", ",[37,1234,1201],{"class":241},[37,1236,245],{"class":73},[37,1238,248],{"class":69},[37,1240,1208],{"class":73},[37,1242,1243],{"class":77},"put",[37,1245,81],{"class":73},[37,1247,1248],{"class":84},"`\u002Fitems\u002F${",[37,1250,1229],{"class":73},[37,1252,1253],{"class":84},"}`",[37,1255,1219],{"class":73},[37,1257,1258,1261,1263,1265,1267,1269,1271,1274,1276,1278,1280,1282],{"class":39,"line":709},[37,1259,1260],{"class":77},"    delete",[37,1262,1198],{"class":73},[37,1264,1229],{"class":241},[37,1266,245],{"class":73},[37,1268,248],{"class":69},[37,1270,1208],{"class":73},[37,1272,1273],{"class":77},"delete",[37,1275,81],{"class":73},[37,1277,1248],{"class":84},[37,1279,1229],{"class":73},[37,1281,1253],{"class":84},[37,1283,1284],{"class":73},"),\n",[37,1286,1287,1290,1293,1295,1298,1301,1304,1307,1309,1312],{"class":39,"line":719},[37,1288,1289],{"class":77},"    default",[37,1291,1292],{"class":73},": () ",[37,1294,248],{"class":69},[37,1296,1297],{"class":73}," { ",[37,1299,1300],{"class":69},"throw",[37,1302,1303],{"class":69}," new",[37,1305,1306],{"class":77}," Error",[37,1308,81],{"class":73},[37,1310,1311],{"class":84},"\"unknown action\"",[37,1313,1314],{"class":73},"); },\n",[37,1316,1317],{"class":39,"line":727},[37,1318,1131],{"class":73},[37,1320,1321,1323,1326,1328,1331,1333,1336,1339],{"class":39,"line":737},[37,1322,600],{"class":69},[37,1324,1325],{"class":77}," dispatch",[37,1327,81],{"class":73},[37,1329,1330],{"class":241},"action",[37,1332,1232],{"class":73},[37,1334,1335],{"class":69},"...",[37,1337,1338],{"class":241},"args",[37,1340,397],{"class":73},[37,1342,1343,1346,1349,1351,1354,1356],{"class":39,"line":743},[37,1344,1345],{"class":69},"    const",[37,1347,1348],{"class":171}," handler",[37,1350,236],{"class":69},[37,1352,1353],{"class":73}," handlers[action] ",[37,1355,1156],{"class":69},[37,1357,1358],{"class":73}," handlers.default;\n",[37,1360,1361,1364,1366,1368,1370],{"class":39,"line":748},[37,1362,1363],{"class":69},"    return",[37,1365,1348],{"class":77},[37,1367,81],{"class":73},[37,1369,1335],{"class":69},[37,1371,1372],{"class":73},"args);\n",[37,1374,1375],{"class":39,"line":754},[37,1376,458],{"class":73},[37,1378,1379],{"class":39,"line":759},[37,1380,1381],{"class":43},"\u002F\u002F dispatch(\"create\", { name: \"Alice\" }) → calls handlers.create(...)\n",[15,1383,1385],{"id":1384},"loops-engine-optimization-and-iteration-patterns","Loops: Engine Optimization and Iteration Patterns",[25,1387,1388],{"language":27},[29,1389,1391],{"className":31,"code":1390,"language":27,"meta":33,"style":33},"\u002F\u002F ── for: classic C-style loop (fastest for arrays) ──\nconst arr = [1, 2, 3, 4, 5];\nfor (let i = 0, len = arr.length; i \u003C len; i++) {\n    console.log(arr[i]);\n}\n\u002F\u002F ⚠️ Cache arr.length in the init (len) — avoids re-reading .length each iteration\n\u002F\u002F (Modern engines optimize this, but the pattern is still a good habit for hot loops)\n\n\u002F\u002F ── for...of: iterates ITERABLES (arrays, strings, Maps, Sets, generators) ──\nfor (const item of arr) { console.log(item); }\nfor (const [index, value] of arr.entries()) { console.log(index, value); }\nfor (const char of \"hello\") { console.log(char); }  \u002F\u002F h e l l o\nfor (const [key, val] of new Map([[\"a\", 1], [\"b\", 2]])) { console.log(key, val); }\n\n\u002F\u002F ── for...in: iterates ENUMERABLE STRING KEYS (objects, including inherited) ──\nconst obj = { a: 1, b: 2 };\nfor (const key in obj) { console.log(key, obj[key]); }  \u002F\u002F \"a 1\" \"b 2\"\n\u002F\u002F ⚠️ for...in iterates PROTOTYPE CHAIN too:\nconst child = Object.create({ inherited: 3 });\nchild.own = 4;\nfor (const key in child) {\n    console.log(key);\n    \u002F\u002F \"own\" (own property)\n    \u002F\u002F \"inherited\" (from prototype!) — usually NOT wanted\n}\n\u002F\u002F ✅ Filter with hasOwnProperty:\nfor (const key in child) {\n    if (Object.hasOwn(child, key)) {  \u002F\u002F only own properties\n        console.log(key);\n    }\n}\n\u002F\u002F ⚠️ for...in on arrays: iterates INDICES (strings), not values, and includes prototype additions\nfor (const i in [10, 20, 30]) { console.log(i, typeof i); }  \u002F\u002F \"0 string\" \"1 string\" \"2 string\"\n\u002F\u002F Never use for...in on arrays — use for, for...of, or forEach\n\n\u002F\u002F ── while \u002F do...while ──\nlet i = 0;\nwhile (i \u003C 3) { console.log(i++); }  \u002F\u002F 0 1 2 (check before body)\nlet j = 0;\ndo { console.log(j++); } while (j \u003C 3);  \u002F\u002F 0 1 2 (check after body — runs at least once)\n\n\u002F\u002F ── Labeled break\u002Fcontinue (for nested loops) ──\nouter: for (let i = 0; i \u003C 3; i++) {\n    inner: for (let j = 0; j \u003C 3; j++) {\n        if (i === 1 && j === 1) break outer;  \u002F\u002F break out of BOTH loops\n        console.log(i, j);\n    }\n}\n\u002F\u002F (0,0) (0,1) (0,2) (1,0) — breaks outer when (1,1)\n",[20,1392,1393,1398,1434,1478,1488,1492,1497,1502,1506,1511,1533,1570,1597,1651,1655,1660,1682,1707,1712,1735,1746,1761,1770,1775,1780,1784,1789,1803,1820,1829,1833,1837,1842,1887,1892,1896,1901,1913,1940,1953,1985,1989,1994,2026,2059,2092,2101,2105,2110],{"__ignoreMap":33},[37,1394,1395],{"class":39,"line":40},[37,1396,1397],{"class":43},"\u002F\u002F ── for: classic C-style loop (fastest for arrays) ──\n",[37,1399,1400,1402,1405,1407,1410,1412,1414,1416,1418,1421,1423,1426,1428,1431],{"class":39,"line":47},[37,1401,230],{"class":69},[37,1403,1404],{"class":171}," arr",[37,1406,236],{"class":69},[37,1408,1409],{"class":73}," [",[37,1411,199],{"class":171},[37,1413,1232],{"class":73},[37,1415,481],{"class":171},[37,1417,1232],{"class":73},[37,1419,1420],{"class":171},"3",[37,1422,1232],{"class":73},[37,1424,1425],{"class":171},"4",[37,1427,1232],{"class":73},[37,1429,1430],{"class":171},"5",[37,1432,1433],{"class":73},"];\n",[37,1435,1436,1439,1441,1444,1447,1450,1453,1456,1458,1461,1464,1467,1470,1473,1476],{"class":39,"line":53},[37,1437,1438],{"class":69},"for",[37,1440,118],{"class":73},[37,1442,1443],{"class":69},"let",[37,1445,1446],{"class":73}," i ",[37,1448,1449],{"class":69},"=",[37,1451,1452],{"class":171}," 0",[37,1454,1455],{"class":73},", len ",[37,1457,1449],{"class":69},[37,1459,1460],{"class":73}," arr.",[37,1462,1463],{"class":171},"length",[37,1465,1466],{"class":73},"; i ",[37,1468,1469],{"class":69},"\u003C",[37,1471,1472],{"class":73}," len; i",[37,1474,1475],{"class":69},"++",[37,1477,397],{"class":73},[37,1479,1480,1483,1485],{"class":39,"line":60},[37,1481,1482],{"class":73},"    console.",[37,1484,78],{"class":77},[37,1486,1487],{"class":73},"(arr[i]);\n",[37,1489,1490],{"class":39,"line":66},[37,1491,458],{"class":73},[37,1493,1494],{"class":39,"line":94},[37,1495,1496],{"class":43},"\u002F\u002F ⚠️ Cache arr.length in the init (len) — avoids re-reading .length each iteration\n",[37,1498,1499],{"class":39,"line":113},[37,1500,1501],{"class":43},"\u002F\u002F (Modern engines optimize this, but the pattern is still a good habit for hot loops)\n",[37,1503,1504],{"class":39,"line":140},[37,1505,57],{"emptyLinePlaceholder":56},[37,1507,1508],{"class":39,"line":164},[37,1509,1510],{"class":43},"\u002F\u002F ── for...of: iterates ITERABLES (arrays, strings, Maps, Sets, generators) ──\n",[37,1512,1513,1515,1517,1519,1522,1525,1528,1530],{"class":39,"line":189},[37,1514,1438],{"class":69},[37,1516,118],{"class":73},[37,1518,230],{"class":69},[37,1520,1521],{"class":171}," item",[37,1523,1524],{"class":69}," of",[37,1526,1527],{"class":73}," arr) { console.",[37,1529,78],{"class":77},[37,1531,1532],{"class":73},"(item); }\n",[37,1534,1535,1537,1539,1541,1543,1546,1548,1551,1554,1557,1559,1562,1565,1567],{"class":39,"line":216},[37,1536,1438],{"class":69},[37,1538,118],{"class":73},[37,1540,230],{"class":69},[37,1542,1409],{"class":73},[37,1544,1545],{"class":171},"index",[37,1547,1232],{"class":73},[37,1549,1550],{"class":171},"value",[37,1552,1553],{"class":73},"] ",[37,1555,1556],{"class":69},"of",[37,1558,1460],{"class":73},[37,1560,1561],{"class":77},"entries",[37,1563,1564],{"class":73},"()) { console.",[37,1566,78],{"class":77},[37,1568,1569],{"class":73},"(index, value); }\n",[37,1571,1572,1574,1576,1578,1581,1583,1586,1589,1591,1594],{"class":39,"line":221},[37,1573,1438],{"class":69},[37,1575,118],{"class":73},[37,1577,230],{"class":69},[37,1579,1580],{"class":171}," char",[37,1582,1524],{"class":69},[37,1584,1585],{"class":84}," \"hello\"",[37,1587,1588],{"class":73},") { console.",[37,1590,78],{"class":77},[37,1592,1593],{"class":73},"(char); }  ",[37,1595,1596],{"class":43},"\u002F\u002F h e l l o\n",[37,1598,1599,1601,1603,1605,1607,1610,1612,1614,1616,1618,1620,1623,1626,1629,1631,1633,1636,1639,1641,1643,1646,1648],{"class":39,"line":227},[37,1600,1438],{"class":69},[37,1602,118],{"class":73},[37,1604,230],{"class":69},[37,1606,1409],{"class":73},[37,1608,1609],{"class":171},"key",[37,1611,1232],{"class":73},[37,1613,242],{"class":171},[37,1615,1553],{"class":73},[37,1617,1556],{"class":69},[37,1619,1303],{"class":69},[37,1621,1622],{"class":77}," Map",[37,1624,1625],{"class":73},"([[",[37,1627,1628],{"class":84},"\"a\"",[37,1630,1232],{"class":73},[37,1632,199],{"class":171},[37,1634,1635],{"class":73},"], [",[37,1637,1638],{"class":84},"\"b\"",[37,1640,1232],{"class":73},[37,1642,481],{"class":171},[37,1644,1645],{"class":73},"]])) { console.",[37,1647,78],{"class":77},[37,1649,1650],{"class":73},"(key, val); }\n",[37,1652,1653],{"class":39,"line":257},[37,1654,57],{"emptyLinePlaceholder":56},[37,1656,1657],{"class":39,"line":281},[37,1658,1659],{"class":43},"\u002F\u002F ── for...in: iterates ENUMERABLE STRING KEYS (objects, including inherited) ──\n",[37,1661,1662,1664,1667,1669,1672,1674,1677,1679],{"class":39,"line":302},[37,1663,230],{"class":69},[37,1665,1666],{"class":171}," obj",[37,1668,236],{"class":69},[37,1670,1671],{"class":73}," { a: ",[37,1673,199],{"class":171},[37,1675,1676],{"class":73},", b: ",[37,1678,481],{"class":171},[37,1680,1681],{"class":73}," };\n",[37,1683,1684,1686,1688,1690,1693,1696,1699,1701,1704],{"class":39,"line":319},[37,1685,1438],{"class":69},[37,1687,118],{"class":73},[37,1689,230],{"class":69},[37,1691,1692],{"class":171}," key",[37,1694,1695],{"class":69}," in",[37,1697,1698],{"class":73}," obj) { console.",[37,1700,78],{"class":77},[37,1702,1703],{"class":73},"(key, obj[key]); }  ",[37,1705,1706],{"class":43},"\u002F\u002F \"a 1\" \"b 2\"\n",[37,1708,1709],{"class":39,"line":340},[37,1710,1711],{"class":43},"\u002F\u002F ⚠️ for...in iterates PROTOTYPE CHAIN too:\n",[37,1713,1714,1716,1719,1721,1724,1727,1730,1732],{"class":39,"line":345},[37,1715,230],{"class":69},[37,1717,1718],{"class":171}," child",[37,1720,236],{"class":69},[37,1722,1723],{"class":73}," Object.",[37,1725,1726],{"class":77},"create",[37,1728,1729],{"class":73},"({ inherited: ",[37,1731,1420],{"class":171},[37,1733,1734],{"class":73}," });\n",[37,1736,1737,1740,1742,1744],{"class":39,"line":351},[37,1738,1739],{"class":73},"child.own ",[37,1741,1449],{"class":69},[37,1743,563],{"class":171},[37,1745,656],{"class":73},[37,1747,1748,1750,1752,1754,1756,1758],{"class":39,"line":357},[37,1749,1438],{"class":69},[37,1751,118],{"class":73},[37,1753,230],{"class":69},[37,1755,1692],{"class":171},[37,1757,1695],{"class":69},[37,1759,1760],{"class":73}," child) {\n",[37,1762,1763,1765,1767],{"class":39,"line":363},[37,1764,1482],{"class":73},[37,1766,78],{"class":77},[37,1768,1769],{"class":73},"(key);\n",[37,1771,1772],{"class":39,"line":621},[37,1773,1774],{"class":43},"    \u002F\u002F \"own\" (own property)\n",[37,1776,1777],{"class":39,"line":633},[37,1778,1779],{"class":43},"    \u002F\u002F \"inherited\" (from prototype!) — usually NOT wanted\n",[37,1781,1782],{"class":39,"line":647},[37,1783,458],{"class":73},[37,1785,1786],{"class":39,"line":659},[37,1787,1788],{"class":43},"\u002F\u002F ✅ Filter with hasOwnProperty:\n",[37,1790,1791,1793,1795,1797,1799,1801],{"class":39,"line":669},[37,1792,1438],{"class":69},[37,1794,118],{"class":73},[37,1796,230],{"class":69},[37,1798,1692],{"class":171},[37,1800,1695],{"class":69},[37,1802,1760],{"class":73},[37,1804,1805,1808,1811,1814,1817],{"class":39,"line":679},[37,1806,1807],{"class":69},"    if",[37,1809,1810],{"class":73}," (Object.",[37,1812,1813],{"class":77},"hasOwn",[37,1815,1816],{"class":73},"(child, key)) {  ",[37,1818,1819],{"class":43},"\u002F\u002F only own properties\n",[37,1821,1822,1825,1827],{"class":39,"line":689},[37,1823,1824],{"class":73},"        console.",[37,1826,78],{"class":77},[37,1828,1769],{"class":73},[37,1830,1831],{"class":39,"line":699},[37,1832,740],{"class":73},[37,1834,1835],{"class":39,"line":709},[37,1836,458],{"class":73},[37,1838,1839],{"class":39,"line":719},[37,1840,1841],{"class":43},"\u002F\u002F ⚠️ for...in on arrays: iterates INDICES (strings), not values, and includes prototype additions\n",[37,1843,1844,1846,1848,1850,1853,1855,1857,1860,1862,1865,1867,1870,1873,1875,1878,1881,1884],{"class":39,"line":727},[37,1845,1438],{"class":69},[37,1847,118],{"class":73},[37,1849,230],{"class":69},[37,1851,1852],{"class":171}," i",[37,1854,1695],{"class":69},[37,1856,1409],{"class":73},[37,1858,1859],{"class":171},"10",[37,1861,1232],{"class":73},[37,1863,1864],{"class":171},"20",[37,1866,1232],{"class":73},[37,1868,1869],{"class":171},"30",[37,1871,1872],{"class":73},"]) { console.",[37,1874,78],{"class":77},[37,1876,1877],{"class":73},"(i, ",[37,1879,1880],{"class":69},"typeof",[37,1882,1883],{"class":73}," i); }  ",[37,1885,1886],{"class":43},"\u002F\u002F \"0 string\" \"1 string\" \"2 string\"\n",[37,1888,1889],{"class":39,"line":737},[37,1890,1891],{"class":43},"\u002F\u002F Never use for...in on arrays — use for, for...of, or forEach\n",[37,1893,1894],{"class":39,"line":743},[37,1895,57],{"emptyLinePlaceholder":56},[37,1897,1898],{"class":39,"line":748},[37,1899,1900],{"class":43},"\u002F\u002F ── while \u002F do...while ──\n",[37,1902,1903,1905,1907,1909,1911],{"class":39,"line":754},[37,1904,1443],{"class":69},[37,1906,1446],{"class":73},[37,1908,1449],{"class":69},[37,1910,1452],{"class":171},[37,1912,656],{"class":73},[37,1914,1915,1918,1921,1923,1925,1927,1929,1932,1934,1937],{"class":39,"line":759},[37,1916,1917],{"class":69},"while",[37,1919,1920],{"class":73}," (i ",[37,1922,1469],{"class":69},[37,1924,535],{"class":171},[37,1926,1588],{"class":73},[37,1928,78],{"class":77},[37,1930,1931],{"class":73},"(i",[37,1933,1475],{"class":69},[37,1935,1936],{"class":73},"); }  ",[37,1938,1939],{"class":43},"\u002F\u002F 0 1 2 (check before body)\n",[37,1941,1942,1944,1947,1949,1951],{"class":39,"line":765},[37,1943,1443],{"class":69},[37,1945,1946],{"class":73}," j ",[37,1948,1449],{"class":69},[37,1950,1452],{"class":171},[37,1952,656],{"class":73},[37,1954,1955,1958,1961,1963,1966,1968,1971,1973,1976,1978,1980,1982],{"class":39,"line":771},[37,1956,1957],{"class":69},"do",[37,1959,1960],{"class":73}," { console.",[37,1962,78],{"class":77},[37,1964,1965],{"class":73},"(j",[37,1967,1475],{"class":69},[37,1969,1970],{"class":73},"); } ",[37,1972,1917],{"class":69},[37,1974,1975],{"class":73}," (j ",[37,1977,1469],{"class":69},[37,1979,535],{"class":171},[37,1981,159],{"class":73},[37,1983,1984],{"class":43},"\u002F\u002F 0 1 2 (check after body — runs at least once)\n",[37,1986,1987],{"class":39,"line":785},[37,1988,57],{"emptyLinePlaceholder":56},[37,1990,1991],{"class":39,"line":793},[37,1992,1993],{"class":43},"\u002F\u002F ── Labeled break\u002Fcontinue (for nested loops) ──\n",[37,1995,1996,1999,2001,2003,2005,2007,2009,2011,2013,2015,2017,2019,2022,2024],{"class":39,"line":816},[37,1997,1998],{"class":77},"outer",[37,2000,801],{"class":73},[37,2002,1438],{"class":69},[37,2004,118],{"class":73},[37,2006,1443],{"class":69},[37,2008,1446],{"class":73},[37,2010,1449],{"class":69},[37,2012,1452],{"class":171},[37,2014,1466],{"class":73},[37,2016,1469],{"class":69},[37,2018,535],{"class":171},[37,2020,2021],{"class":73},"; i",[37,2023,1475],{"class":69},[37,2025,397],{"class":73},[37,2027,2028,2031,2033,2035,2037,2039,2041,2043,2045,2048,2050,2052,2055,2057],{"class":39,"line":838},[37,2029,2030],{"class":77},"    inner",[37,2032,801],{"class":73},[37,2034,1438],{"class":69},[37,2036,118],{"class":73},[37,2038,1443],{"class":69},[37,2040,1946],{"class":73},[37,2042,1449],{"class":69},[37,2044,1452],{"class":171},[37,2046,2047],{"class":73},"; j ",[37,2049,1469],{"class":69},[37,2051,535],{"class":171},[37,2053,2054],{"class":73},"; j",[37,2056,1475],{"class":69},[37,2058,397],{"class":73},[37,2060,2061,2064,2066,2069,2071,2074,2076,2078,2080,2082,2084,2087,2089],{"class":39,"line":858},[37,2062,2063],{"class":69},"        if",[37,2065,1920],{"class":73},[37,2067,2068],{"class":69},"===",[37,2070,405],{"class":171},[37,2072,2073],{"class":69}," &&",[37,2075,1946],{"class":73},[37,2077,2068],{"class":69},[37,2079,405],{"class":171},[37,2081,245],{"class":73},[37,2083,421],{"class":69},[37,2085,2086],{"class":77}," outer",[37,2088,450],{"class":73},[37,2090,2091],{"class":43},"\u002F\u002F break out of BOTH loops\n",[37,2093,2094,2096,2098],{"class":39,"line":863},[37,2095,1824],{"class":73},[37,2097,78],{"class":77},[37,2099,2100],{"class":73},"(i, j);\n",[37,2102,2103],{"class":39,"line":868},[37,2104,740],{"class":73},[37,2106,2108],{"class":39,"line":2107},48,[37,2109,458],{"class":73},[37,2111,2113],{"class":39,"line":2112},49,[37,2114,2115],{"class":43},"\u002F\u002F (0,0) (0,1) (0,2) (1,0) — breaks outer when (1,1)\n",[15,2117,2119,2122,2123,2122,2126,2129,2130,2132],{"id":2118},"try-catch-finally-the-finally-trap",[20,2120,2121],{},"try"," \u002F ",[20,2124,2125],{},"catch",[20,2127,2128],{},"finally",": The ",[20,2131,2128],{}," Trap",[25,2134,2135],{"language":27},[29,2136,2138],{"className":31,"code":2137,"language":27,"meta":33,"style":33},"\u002F\u002F ── finally ALWAYS runs — even after return, break, continue, or throw ──\nfunction example() {\n    try {\n        return \"try\";       \u002F\u002F value is captured, but NOT returned yet\n    } catch (e) {\n        return \"catch\";\n    } finally {\n        console.log(\"finally runs before return\");  \u002F\u002F runs BEFORE return completes\n        \u002F\u002F if finally has its own return, it OVERRIDES try's return:\n        \u002F\u002F return \"finally\";  \u002F\u002F ← uncomment to override \"try\" return\n    }\n}\nconsole.log(example());  \u002F\u002F logs \"finally runs before return\", then returns \"try\"\n\n\u002F\u002F ── finally overrides try's return ──\nfunction override() {\n    try {\n        return \"try\";\n    } finally {\n        return \"finally\";  \u002F\u002F overrides try's return value!\n    }\n}\nconsole.log(override());  \u002F\u002F \"finally\" (try's \"try\" is discarded)\n\n\u002F\u002F ── finally runs even after throw ──\nfunction withThrow() {\n    try {\n        throw new Error(\"boom\");\n    } catch (e) {\n        return \"caught\";  \u002F\u002F value captured\n    } finally {\n        console.log(\"cleanup\");  \u002F\u002F runs before return completes\n    }\n}\nconsole.log(withThrow());  \u002F\u002F logs \"cleanup\", returns \"caught\"\n\n\u002F\u002F ── Anti-pattern: finally that throws swallows the original error ──\nfunction badFinally() {\n    try {\n        throw new Error(\"original error\");\n    } finally {\n        throw new Error(\"finally error\");  \u002F\u002F OVERRIDES the original error!\n        \u002F\u002F The caller sees \"finally error\", not \"original error\" — hard to debug\n    }\n}\n\u002F\u002F badFinally();  \u002F\u002F throws \"finally error\" (original error lost)\n\n\u002F\u002F ── Optional catch binding (ES2019) — omit the error variable ──\ntry {\n    JSON.parse(invalidJson);\n} catch {  \u002F\u002F no (e) needed if you don't use the error\n    console.log(\"invalid JSON, ignoring\");\n}\n\n\u002F\u002F ── try\u002Fcatch with await (ES2019) ──\nasync function safeFetch(url) {\n    try {\n        const response = await fetch(url);\n        return await response.json();\n    } catch (error) {\n        if (error instanceof TypeError) {\n            console.log(\"network error\");\n        }\n        throw error;  \u002F\u002F re-throw\n    } finally {\n        console.log(\"cleanup\");  \u002F\u002F runs after try\u002Fcatch, even with await\n    }\n}\n",[20,2139,2140,2145,2155,2162,2176,2186,2195,2203,2219,2224,2232,2236,2240,2257,2261,2266,2275,2281,2289,2297,2309,2313,2317,2333,2337,2342,2351,2357,2373,2381,2393,2401,2417,2421,2425,2441,2445,2450,2459,2465,2480,2488,2506,2511,2515,2519,2527,2531,2536,2542,2557,2571,2585,2590,2595,2601,2620,2627,2647,2663,2673,2689,2704,2710,2721,2730,2746,2751],{"__ignoreMap":33},[37,2141,2142],{"class":39,"line":40},[37,2143,2144],{"class":43},"\u002F\u002F ── finally ALWAYS runs — even after return, break, continue, or throw ──\n",[37,2146,2147,2149,2152],{"class":39,"line":47},[37,2148,600],{"class":69},[37,2150,2151],{"class":77}," example",[37,2153,2154],{"class":73},"() {\n",[37,2156,2157,2160],{"class":39,"line":53},[37,2158,2159],{"class":69},"    try",[37,2161,1053],{"class":73},[37,2163,2164,2167,2170,2173],{"class":39,"line":60},[37,2165,2166],{"class":69},"        return",[37,2168,2169],{"class":84}," \"try\"",[37,2171,2172],{"class":73},";       ",[37,2174,2175],{"class":43},"\u002F\u002F value is captured, but NOT returned yet\n",[37,2177,2178,2181,2183],{"class":39,"line":66},[37,2179,2180],{"class":73},"    } ",[37,2182,2125],{"class":69},[37,2184,2185],{"class":73}," (e) {\n",[37,2187,2188,2190,2193],{"class":39,"line":94},[37,2189,2166],{"class":69},[37,2191,2192],{"class":84}," \"catch\"",[37,2194,656],{"class":73},[37,2196,2197,2199,2201],{"class":39,"line":113},[37,2198,2180],{"class":73},[37,2200,2128],{"class":69},[37,2202,1053],{"class":73},[37,2204,2205,2207,2209,2211,2214,2216],{"class":39,"line":140},[37,2206,1824],{"class":73},[37,2208,78],{"class":77},[37,2210,81],{"class":73},[37,2212,2213],{"class":84},"\"finally runs before return\"",[37,2215,159],{"class":73},[37,2217,2218],{"class":43},"\u002F\u002F runs BEFORE return completes\n",[37,2220,2221],{"class":39,"line":164},[37,2222,2223],{"class":43},"        \u002F\u002F if finally has its own return, it OVERRIDES try's return:\n",[37,2225,2226,2229],{"class":39,"line":189},[37,2227,2228],{"class":43},"        \u002F\u002F return \"finally\";",[37,2230,2231],{"class":43},"  \u002F\u002F ← uncomment to override \"try\" return\n",[37,2233,2234],{"class":39,"line":216},[37,2235,740],{"class":73},[37,2237,2238],{"class":39,"line":221},[37,2239,458],{"class":73},[37,2241,2242,2244,2246,2248,2251,2254],{"class":39,"line":227},[37,2243,260],{"class":73},[37,2245,78],{"class":77},[37,2247,81],{"class":73},[37,2249,2250],{"class":77},"example",[37,2252,2253],{"class":73},"());  ",[37,2255,2256],{"class":43},"\u002F\u002F logs \"finally runs before return\", then returns \"try\"\n",[37,2258,2259],{"class":39,"line":257},[37,2260,57],{"emptyLinePlaceholder":56},[37,2262,2263],{"class":39,"line":281},[37,2264,2265],{"class":43},"\u002F\u002F ── finally overrides try's return ──\n",[37,2267,2268,2270,2273],{"class":39,"line":302},[37,2269,600],{"class":69},[37,2271,2272],{"class":77}," override",[37,2274,2154],{"class":73},[37,2276,2277,2279],{"class":39,"line":319},[37,2278,2159],{"class":69},[37,2280,1053],{"class":73},[37,2282,2283,2285,2287],{"class":39,"line":340},[37,2284,2166],{"class":69},[37,2286,2169],{"class":84},[37,2288,656],{"class":73},[37,2290,2291,2293,2295],{"class":39,"line":345},[37,2292,2180],{"class":73},[37,2294,2128],{"class":69},[37,2296,1053],{"class":73},[37,2298,2299,2301,2304,2306],{"class":39,"line":351},[37,2300,2166],{"class":69},[37,2302,2303],{"class":84}," \"finally\"",[37,2305,450],{"class":73},[37,2307,2308],{"class":43},"\u002F\u002F overrides try's return value!\n",[37,2310,2311],{"class":39,"line":357},[37,2312,740],{"class":73},[37,2314,2315],{"class":39,"line":363},[37,2316,458],{"class":73},[37,2318,2319,2321,2323,2325,2328,2330],{"class":39,"line":621},[37,2320,260],{"class":73},[37,2322,78],{"class":77},[37,2324,81],{"class":73},[37,2326,2327],{"class":77},"override",[37,2329,2253],{"class":73},[37,2331,2332],{"class":43},"\u002F\u002F \"finally\" (try's \"try\" is discarded)\n",[37,2334,2335],{"class":39,"line":633},[37,2336,57],{"emptyLinePlaceholder":56},[37,2338,2339],{"class":39,"line":647},[37,2340,2341],{"class":43},"\u002F\u002F ── finally runs even after throw ──\n",[37,2343,2344,2346,2349],{"class":39,"line":659},[37,2345,600],{"class":69},[37,2347,2348],{"class":77}," withThrow",[37,2350,2154],{"class":73},[37,2352,2353,2355],{"class":39,"line":669},[37,2354,2159],{"class":69},[37,2356,1053],{"class":73},[37,2358,2359,2362,2364,2366,2368,2371],{"class":39,"line":679},[37,2360,2361],{"class":69},"        throw",[37,2363,1303],{"class":69},[37,2365,1306],{"class":77},[37,2367,81],{"class":73},[37,2369,2370],{"class":84},"\"boom\"",[37,2372,501],{"class":73},[37,2374,2375,2377,2379],{"class":39,"line":689},[37,2376,2180],{"class":73},[37,2378,2125],{"class":69},[37,2380,2185],{"class":73},[37,2382,2383,2385,2388,2390],{"class":39,"line":699},[37,2384,2166],{"class":69},[37,2386,2387],{"class":84}," \"caught\"",[37,2389,450],{"class":73},[37,2391,2392],{"class":43},"\u002F\u002F value captured\n",[37,2394,2395,2397,2399],{"class":39,"line":709},[37,2396,2180],{"class":73},[37,2398,2128],{"class":69},[37,2400,1053],{"class":73},[37,2402,2403,2405,2407,2409,2412,2414],{"class":39,"line":719},[37,2404,1824],{"class":73},[37,2406,78],{"class":77},[37,2408,81],{"class":73},[37,2410,2411],{"class":84},"\"cleanup\"",[37,2413,159],{"class":73},[37,2415,2416],{"class":43},"\u002F\u002F runs before return completes\n",[37,2418,2419],{"class":39,"line":727},[37,2420,740],{"class":73},[37,2422,2423],{"class":39,"line":737},[37,2424,458],{"class":73},[37,2426,2427,2429,2431,2433,2436,2438],{"class":39,"line":743},[37,2428,260],{"class":73},[37,2430,78],{"class":77},[37,2432,81],{"class":73},[37,2434,2435],{"class":77},"withThrow",[37,2437,2253],{"class":73},[37,2439,2440],{"class":43},"\u002F\u002F logs \"cleanup\", returns \"caught\"\n",[37,2442,2443],{"class":39,"line":748},[37,2444,57],{"emptyLinePlaceholder":56},[37,2446,2447],{"class":39,"line":754},[37,2448,2449],{"class":43},"\u002F\u002F ── Anti-pattern: finally that throws swallows the original error ──\n",[37,2451,2452,2454,2457],{"class":39,"line":759},[37,2453,600],{"class":69},[37,2455,2456],{"class":77}," badFinally",[37,2458,2154],{"class":73},[37,2460,2461,2463],{"class":39,"line":765},[37,2462,2159],{"class":69},[37,2464,1053],{"class":73},[37,2466,2467,2469,2471,2473,2475,2478],{"class":39,"line":771},[37,2468,2361],{"class":69},[37,2470,1303],{"class":69},[37,2472,1306],{"class":77},[37,2474,81],{"class":73},[37,2476,2477],{"class":84},"\"original error\"",[37,2479,501],{"class":73},[37,2481,2482,2484,2486],{"class":39,"line":785},[37,2483,2180],{"class":73},[37,2485,2128],{"class":69},[37,2487,1053],{"class":73},[37,2489,2490,2492,2494,2496,2498,2501,2503],{"class":39,"line":793},[37,2491,2361],{"class":69},[37,2493,1303],{"class":69},[37,2495,1306],{"class":77},[37,2497,81],{"class":73},[37,2499,2500],{"class":84},"\"finally error\"",[37,2502,159],{"class":73},[37,2504,2505],{"class":43},"\u002F\u002F OVERRIDES the original error!\n",[37,2507,2508],{"class":39,"line":816},[37,2509,2510],{"class":43},"        \u002F\u002F The caller sees \"finally error\", not \"original error\" — hard to debug\n",[37,2512,2513],{"class":39,"line":838},[37,2514,740],{"class":73},[37,2516,2517],{"class":39,"line":858},[37,2518,458],{"class":73},[37,2520,2521,2524],{"class":39,"line":863},[37,2522,2523],{"class":43},"\u002F\u002F badFinally();",[37,2525,2526],{"class":43},"  \u002F\u002F throws \"finally error\" (original error lost)\n",[37,2528,2529],{"class":39,"line":868},[37,2530,57],{"emptyLinePlaceholder":56},[37,2532,2533],{"class":39,"line":2107},[37,2534,2535],{"class":43},"\u002F\u002F ── Optional catch binding (ES2019) — omit the error variable ──\n",[37,2537,2538,2540],{"class":39,"line":2112},[37,2539,2121],{"class":69},[37,2541,1053],{"class":73},[37,2543,2545,2548,2551,2554],{"class":39,"line":2544},50,[37,2546,2547],{"class":171},"    JSON",[37,2549,2550],{"class":73},".",[37,2552,2553],{"class":77},"parse",[37,2555,2556],{"class":73},"(invalidJson);\n",[37,2558,2560,2563,2565,2568],{"class":39,"line":2559},51,[37,2561,2562],{"class":73},"} ",[37,2564,2125],{"class":69},[37,2566,2567],{"class":73}," {  ",[37,2569,2570],{"class":43},"\u002F\u002F no (e) needed if you don't use the error\n",[37,2572,2574,2576,2578,2580,2583],{"class":39,"line":2573},52,[37,2575,1482],{"class":73},[37,2577,78],{"class":77},[37,2579,81],{"class":73},[37,2581,2582],{"class":84},"\"invalid JSON, ignoring\"",[37,2584,501],{"class":73},[37,2586,2588],{"class":39,"line":2587},53,[37,2589,458],{"class":73},[37,2591,2593],{"class":39,"line":2592},54,[37,2594,57],{"emptyLinePlaceholder":56},[37,2596,2598],{"class":39,"line":2597},55,[37,2599,2600],{"class":43},"\u002F\u002F ── try\u002Fcatch with await (ES2019) ──\n",[37,2602,2604,2607,2610,2613,2615,2618],{"class":39,"line":2603},56,[37,2605,2606],{"class":69},"async",[37,2608,2609],{"class":69}," function",[37,2611,2612],{"class":77}," safeFetch",[37,2614,81],{"class":73},[37,2616,2617],{"class":241},"url",[37,2619,397],{"class":73},[37,2621,2623,2625],{"class":39,"line":2622},57,[37,2624,2159],{"class":69},[37,2626,1053],{"class":73},[37,2628,2630,2633,2636,2638,2641,2644],{"class":39,"line":2629},58,[37,2631,2632],{"class":69},"        const",[37,2634,2635],{"class":171}," response",[37,2637,236],{"class":69},[37,2639,2640],{"class":69}," await",[37,2642,2643],{"class":77}," fetch",[37,2645,2646],{"class":73},"(url);\n",[37,2648,2650,2652,2654,2657,2660],{"class":39,"line":2649},59,[37,2651,2166],{"class":69},[37,2653,2640],{"class":69},[37,2655,2656],{"class":73}," response.",[37,2658,2659],{"class":77},"json",[37,2661,2662],{"class":73},"();\n",[37,2664,2666,2668,2670],{"class":39,"line":2665},60,[37,2667,2180],{"class":73},[37,2669,2125],{"class":69},[37,2671,2672],{"class":73}," (error) {\n",[37,2674,2676,2678,2681,2684,2687],{"class":39,"line":2675},61,[37,2677,2063],{"class":69},[37,2679,2680],{"class":73}," (error ",[37,2682,2683],{"class":69},"instanceof",[37,2685,2686],{"class":77}," TypeError",[37,2688,397],{"class":73},[37,2690,2692,2695,2697,2699,2702],{"class":39,"line":2691},62,[37,2693,2694],{"class":73},"            console.",[37,2696,78],{"class":77},[37,2698,81],{"class":73},[37,2700,2701],{"class":84},"\"network error\"",[37,2703,501],{"class":73},[37,2705,2707],{"class":39,"line":2706},63,[37,2708,2709],{"class":73},"        }\n",[37,2711,2713,2715,2718],{"class":39,"line":2712},64,[37,2714,2361],{"class":69},[37,2716,2717],{"class":73}," error;  ",[37,2719,2720],{"class":43},"\u002F\u002F re-throw\n",[37,2722,2724,2726,2728],{"class":39,"line":2723},65,[37,2725,2180],{"class":73},[37,2727,2128],{"class":69},[37,2729,1053],{"class":73},[37,2731,2733,2735,2737,2739,2741,2743],{"class":39,"line":2732},66,[37,2734,1824],{"class":73},[37,2736,78],{"class":77},[37,2738,81],{"class":73},[37,2740,2411],{"class":84},[37,2742,159],{"class":73},[37,2744,2745],{"class":43},"\u002F\u002F runs after try\u002Fcatch, even with await\n",[37,2747,2749],{"class":39,"line":2748},67,[37,2750,740],{"class":73},[37,2752,2754],{"class":39,"line":2753},68,[37,2755,458],{"class":73},[15,2757,2759],{"id":2758},"production-pattern-retry-with-exponential-backoff","Production Pattern: Retry with Exponential Backoff",[25,2761,2762],{"language":27},[29,2763,2765],{"className":31,"code":2764,"language":27,"meta":33,"style":33},"async function retry(fn, { maxAttempts = 5, baseDelay = 1000, maxDelay = 30000 } = {}) {\n    let attempt = 0;\n    while (true) {\n        try {\n            return await fn(attempt);  \u002F\u002F pass attempt number to the function\n        } catch (error) {\n            attempt++;\n            if (attempt >= maxAttempts) throw error;  \u002F\u002F give up\n\n            \u002F\u002F Exponential backoff with jitter (prevent thundering herd):\n            const delay = Math.min(baseDelay * 2 ** attempt, maxDelay);\n            const jitter = Math.random() * delay * 0.1;  \u002F\u002F ±10% jitter\n            console.warn(`attempt ${attempt} failed, retrying in ${Math.round(delay + jitter)}ms`);\n\n            await new Promise(r => setTimeout(r, delay + jitter));\n        }\n    }\n}\n\n\u002F\u002F Usage:\n\u002F\u002F const data = await retry(() => fetch(\"\u002Fapi\u002Fdata\").then(r => r.json()), {\n\u002F\u002F     maxAttempts: 3,\n\u002F\u002F     baseDelay: 500,\n\u002F\u002F });\n",[20,2766,2767,2820,2834,2846,2853,2868,2877,2886,2907,2911,2916,2946,2978,3022,3026,3056,3060,3064,3068,3072,3077,3082,3087,3092],{"__ignoreMap":33},[37,2768,2769,2771,2773,2776,2778,2781,2784,2787,2789,2792,2794,2797,2799,2802,2804,2807,2809,2812,2815,2817],{"class":39,"line":40},[37,2770,2606],{"class":69},[37,2772,2609],{"class":69},[37,2774,2775],{"class":77}," retry",[37,2777,81],{"class":73},[37,2779,2780],{"class":241},"fn",[37,2782,2783],{"class":73},", { ",[37,2785,2786],{"class":241},"maxAttempts",[37,2788,236],{"class":69},[37,2790,2791],{"class":171}," 5",[37,2793,1232],{"class":73},[37,2795,2796],{"class":241},"baseDelay",[37,2798,236],{"class":69},[37,2800,2801],{"class":171}," 1000",[37,2803,1232],{"class":73},[37,2805,2806],{"class":241},"maxDelay",[37,2808,236],{"class":69},[37,2810,2811],{"class":171}," 30000",[37,2813,2814],{"class":73}," } ",[37,2816,1449],{"class":69},[37,2818,2819],{"class":73}," {}) {\n",[37,2821,2822,2825,2828,2830,2832],{"class":39,"line":47},[37,2823,2824],{"class":69},"    let",[37,2826,2827],{"class":73}," attempt ",[37,2829,1449],{"class":69},[37,2831,1452],{"class":171},[37,2833,656],{"class":73},[37,2835,2836,2839,2841,2844],{"class":39,"line":53},[37,2837,2838],{"class":69},"    while",[37,2840,118],{"class":73},[37,2842,2843],{"class":171},"true",[37,2845,397],{"class":73},[37,2847,2848,2851],{"class":39,"line":60},[37,2849,2850],{"class":69},"        try",[37,2852,1053],{"class":73},[37,2854,2855,2857,2859,2862,2865],{"class":39,"line":66},[37,2856,650],{"class":69},[37,2858,2640],{"class":69},[37,2860,2861],{"class":77}," fn",[37,2863,2864],{"class":73},"(attempt);  ",[37,2866,2867],{"class":43},"\u002F\u002F pass attempt number to the function\n",[37,2869,2870,2873,2875],{"class":39,"line":94},[37,2871,2872],{"class":73},"        } ",[37,2874,2125],{"class":69},[37,2876,2672],{"class":73},[37,2878,2879,2882,2884],{"class":39,"line":113},[37,2880,2881],{"class":73},"            attempt",[37,2883,1475],{"class":69},[37,2885,656],{"class":73},[37,2887,2888,2891,2894,2897,2900,2902,2904],{"class":39,"line":140},[37,2889,2890],{"class":69},"            if",[37,2892,2893],{"class":73}," (attempt ",[37,2895,2896],{"class":69},">=",[37,2898,2899],{"class":73}," maxAttempts) ",[37,2901,1300],{"class":69},[37,2903,2717],{"class":73},[37,2905,2906],{"class":43},"\u002F\u002F give up\n",[37,2908,2909],{"class":39,"line":164},[37,2910,57],{"emptyLinePlaceholder":56},[37,2912,2913],{"class":39,"line":189},[37,2914,2915],{"class":43},"            \u002F\u002F Exponential backoff with jitter (prevent thundering herd):\n",[37,2917,2918,2921,2924,2926,2929,2932,2935,2938,2940,2943],{"class":39,"line":216},[37,2919,2920],{"class":69},"            const",[37,2922,2923],{"class":171}," delay",[37,2925,236],{"class":69},[37,2927,2928],{"class":73}," Math.",[37,2930,2931],{"class":77},"min",[37,2933,2934],{"class":73},"(baseDelay ",[37,2936,2937],{"class":69},"*",[37,2939,513],{"class":171},[37,2941,2942],{"class":69}," **",[37,2944,2945],{"class":73}," attempt, maxDelay);\n",[37,2947,2948,2950,2953,2955,2957,2960,2963,2965,2968,2970,2973,2975],{"class":39,"line":221},[37,2949,2920],{"class":69},[37,2951,2952],{"class":171}," jitter",[37,2954,236],{"class":69},[37,2956,2928],{"class":73},[37,2958,2959],{"class":77},"random",[37,2961,2962],{"class":73},"() ",[37,2964,2937],{"class":69},[37,2966,2967],{"class":73}," delay ",[37,2969,2937],{"class":69},[37,2971,2972],{"class":171}," 0.1",[37,2974,450],{"class":73},[37,2976,2977],{"class":43},"\u002F\u002F ±10% jitter\n",[37,2979,2980,2982,2985,2987,2990,2993,2996,2999,3001,3004,3006,3009,3012,3014,3017,3020],{"class":39,"line":227},[37,2981,2694],{"class":73},[37,2983,2984],{"class":77},"warn",[37,2986,81],{"class":73},[37,2988,2989],{"class":84},"`attempt ${",[37,2991,2992],{"class":73},"attempt",[37,2994,2995],{"class":84},"} failed, retrying in ${",[37,2997,2998],{"class":73},"Math",[37,3000,2550],{"class":84},[37,3002,3003],{"class":77},"round",[37,3005,81],{"class":84},[37,3007,3008],{"class":73},"delay",[37,3010,3011],{"class":69}," +",[37,3013,2952],{"class":73},[37,3015,3016],{"class":84},")",[37,3018,3019],{"class":84},"}ms`",[37,3021,501],{"class":73},[37,3023,3024],{"class":39,"line":257},[37,3025,57],{"emptyLinePlaceholder":56},[37,3027,3028,3031,3033,3036,3038,3041,3044,3047,3050,3053],{"class":39,"line":281},[37,3029,3030],{"class":69},"            await",[37,3032,1303],{"class":69},[37,3034,3035],{"class":171}," Promise",[37,3037,81],{"class":73},[37,3039,3040],{"class":241},"r",[37,3042,3043],{"class":69}," =>",[37,3045,3046],{"class":77}," setTimeout",[37,3048,3049],{"class":73},"(r, delay ",[37,3051,3052],{"class":69},"+",[37,3054,3055],{"class":73}," jitter));\n",[37,3057,3058],{"class":39,"line":302},[37,3059,2709],{"class":73},[37,3061,3062],{"class":39,"line":319},[37,3063,740],{"class":73},[37,3065,3066],{"class":39,"line":340},[37,3067,458],{"class":73},[37,3069,3070],{"class":39,"line":345},[37,3071,57],{"emptyLinePlaceholder":56},[37,3073,3074],{"class":39,"line":351},[37,3075,3076],{"class":43},"\u002F\u002F Usage:\n",[37,3078,3079],{"class":39,"line":357},[37,3080,3081],{"class":43},"\u002F\u002F const data = await retry(() => fetch(\"\u002Fapi\u002Fdata\").then(r => r.json()), {\n",[37,3083,3084],{"class":39,"line":363},[37,3085,3086],{"class":43},"\u002F\u002F     maxAttempts: 3,\n",[37,3088,3089],{"class":39,"line":621},[37,3090,3091],{"class":43},"\u002F\u002F     baseDelay: 500,\n",[37,3093,3094],{"class":39,"line":633},[37,3095,3096],{"class":43},"\u002F\u002F });\n",[15,3098,3100],{"id":3099},"tips-tricks","💡 Tips & Tricks",[25,3102,3103],{"language":27},[29,3104,3106],{"className":31,"code":3105,"language":27,"meta":33,"style":33},"\u002F\u002F ── `continue` in a for loop skips to the increment ──\nfor (let i = 0; i \u003C 10; i++) {\n    if (i % 2 === 0) continue;  \u002F\u002F skip even numbers\n    console.log(i);  \u002F\u002F 1 3 5 7 9\n}\n\n\u002F\u002F ── `break` in a for...of exits the loop ──\nfor (const item of items) {\n    if (item === \"stop\") break;  \u002F\u002F exit the loop\n    console.log(item);\n}\n\n\u002F\u002F ── Find first match with for...of (no .find() needed) ──\nfunction findFirst(arr, predicate) {\n    for (const item of arr) {\n        if (predicate(item)) return item;  \u002F\u002F return exits the loop\n    }\n    return undefined;\n}\n\n\u002F\u002F ── Early return from a loop (cleaner than a flag variable) ──\nfunction contains(arr, target) {\n    for (const item of arr) {\n        if (item === target) return true;  \u002F\u002F early exit\n    }\n    return false;\n}\n\n\u002F\u002F ── while(true) with break for polling ──\nwhile (true) {\n    const result = await checkCondition();\n    if (result.done) break;\n    await sleep(1000);\n}\n\n\u002F\u002F ── Object lookup for O(1) dispatch (vs switch's O(n)) ──\nconst operations = {\n    add: (a, b) => a + b,\n    sub: (a, b) => a - b,\n    mul: (a, b) => a * b,\n    div: (a, b) => a \u002F b,\n};\nfunction calculate(op, a, b) {\n    if (!(op in operations)) throw new Error(`unknown op: ${op}`);\n    return operations[op](a, b);  \u002F\u002F O(1) lookup\n}\n",[20,3107,3108,3113,3140,3166,3178,3182,3186,3191,3206,3227,3236,3240,3244,3249,3268,3284,3303,3307,3316,3320,3324,3329,3347,3361,3382,3386,3395,3399,3403,3408,3418,3434,3445,3460,3464,3468,3473,3484,3511,3534,3557,3581,3585,3607,3642,3652],{"__ignoreMap":33},[37,3109,3110],{"class":39,"line":40},[37,3111,3112],{"class":43},"\u002F\u002F ── `continue` in a for loop skips to the increment ──\n",[37,3114,3115,3117,3119,3121,3123,3125,3127,3129,3131,3134,3136,3138],{"class":39,"line":47},[37,3116,1438],{"class":69},[37,3118,118],{"class":73},[37,3120,1443],{"class":69},[37,3122,1446],{"class":73},[37,3124,1449],{"class":69},[37,3126,1452],{"class":171},[37,3128,1466],{"class":73},[37,3130,1469],{"class":69},[37,3132,3133],{"class":171}," 10",[37,3135,2021],{"class":73},[37,3137,1475],{"class":69},[37,3139,397],{"class":73},[37,3141,3142,3144,3146,3149,3151,3154,3156,3158,3161,3163],{"class":39,"line":53},[37,3143,1807],{"class":69},[37,3145,1920],{"class":73},[37,3147,3148],{"class":69},"%",[37,3150,513],{"class":171},[37,3152,3153],{"class":69}," ===",[37,3155,1452],{"class":171},[37,3157,245],{"class":73},[37,3159,3160],{"class":69},"continue",[37,3162,450],{"class":73},[37,3164,3165],{"class":43},"\u002F\u002F skip even numbers\n",[37,3167,3168,3170,3172,3175],{"class":39,"line":60},[37,3169,1482],{"class":73},[37,3171,78],{"class":77},[37,3173,3174],{"class":73},"(i);  ",[37,3176,3177],{"class":43},"\u002F\u002F 1 3 5 7 9\n",[37,3179,3180],{"class":39,"line":66},[37,3181,458],{"class":73},[37,3183,3184],{"class":39,"line":94},[37,3185,57],{"emptyLinePlaceholder":56},[37,3187,3188],{"class":39,"line":113},[37,3189,3190],{"class":43},"\u002F\u002F ── `break` in a for...of exits the loop ──\n",[37,3192,3193,3195,3197,3199,3201,3203],{"class":39,"line":140},[37,3194,1438],{"class":69},[37,3196,118],{"class":73},[37,3198,230],{"class":69},[37,3200,1521],{"class":171},[37,3202,1524],{"class":69},[37,3204,3205],{"class":73}," items) {\n",[37,3207,3208,3210,3213,3215,3218,3220,3222,3224],{"class":39,"line":164},[37,3209,1807],{"class":69},[37,3211,3212],{"class":73}," (item ",[37,3214,2068],{"class":69},[37,3216,3217],{"class":84}," \"stop\"",[37,3219,245],{"class":73},[37,3221,421],{"class":69},[37,3223,450],{"class":73},[37,3225,3226],{"class":43},"\u002F\u002F exit the loop\n",[37,3228,3229,3231,3233],{"class":39,"line":189},[37,3230,1482],{"class":73},[37,3232,78],{"class":77},[37,3234,3235],{"class":73},"(item);\n",[37,3237,3238],{"class":39,"line":216},[37,3239,458],{"class":73},[37,3241,3242],{"class":39,"line":221},[37,3243,57],{"emptyLinePlaceholder":56},[37,3245,3246],{"class":39,"line":227},[37,3247,3248],{"class":43},"\u002F\u002F ── Find first match with for...of (no .find() needed) ──\n",[37,3250,3251,3253,3256,3258,3261,3263,3266],{"class":39,"line":257},[37,3252,600],{"class":69},[37,3254,3255],{"class":77}," findFirst",[37,3257,81],{"class":73},[37,3259,3260],{"class":241},"arr",[37,3262,1232],{"class":73},[37,3264,3265],{"class":241},"predicate",[37,3267,397],{"class":73},[37,3269,3270,3273,3275,3277,3279,3281],{"class":39,"line":281},[37,3271,3272],{"class":69},"    for",[37,3274,118],{"class":73},[37,3276,230],{"class":69},[37,3278,1521],{"class":171},[37,3280,1524],{"class":69},[37,3282,3283],{"class":73}," arr) {\n",[37,3285,3286,3288,3290,3292,3295,3297,3300],{"class":39,"line":302},[37,3287,2063],{"class":69},[37,3289,118],{"class":73},[37,3291,3265],{"class":77},[37,3293,3294],{"class":73},"(item)) ",[37,3296,804],{"class":69},[37,3298,3299],{"class":73}," item;  ",[37,3301,3302],{"class":43},"\u002F\u002F return exits the loop\n",[37,3304,3305],{"class":39,"line":319},[37,3306,740],{"class":73},[37,3308,3309,3311,3314],{"class":39,"line":340},[37,3310,1363],{"class":69},[37,3312,3313],{"class":171}," undefined",[37,3315,656],{"class":73},[37,3317,3318],{"class":39,"line":345},[37,3319,458],{"class":73},[37,3321,3322],{"class":39,"line":351},[37,3323,57],{"emptyLinePlaceholder":56},[37,3325,3326],{"class":39,"line":357},[37,3327,3328],{"class":43},"\u002F\u002F ── Early return from a loop (cleaner than a flag variable) ──\n",[37,3330,3331,3333,3336,3338,3340,3342,3345],{"class":39,"line":363},[37,3332,600],{"class":69},[37,3334,3335],{"class":77}," contains",[37,3337,81],{"class":73},[37,3339,3260],{"class":241},[37,3341,1232],{"class":73},[37,3343,3344],{"class":241},"target",[37,3346,397],{"class":73},[37,3348,3349,3351,3353,3355,3357,3359],{"class":39,"line":621},[37,3350,3272],{"class":69},[37,3352,118],{"class":73},[37,3354,230],{"class":69},[37,3356,1521],{"class":171},[37,3358,1524],{"class":69},[37,3360,3283],{"class":73},[37,3362,3363,3365,3367,3369,3372,3374,3377,3379],{"class":39,"line":633},[37,3364,2063],{"class":69},[37,3366,3212],{"class":73},[37,3368,2068],{"class":69},[37,3370,3371],{"class":73}," target) ",[37,3373,804],{"class":69},[37,3375,3376],{"class":171}," true",[37,3378,450],{"class":73},[37,3380,3381],{"class":43},"\u002F\u002F early exit\n",[37,3383,3384],{"class":39,"line":647},[37,3385,740],{"class":73},[37,3387,3388,3390,3393],{"class":39,"line":659},[37,3389,1363],{"class":69},[37,3391,3392],{"class":171}," false",[37,3394,656],{"class":73},[37,3396,3397],{"class":39,"line":669},[37,3398,458],{"class":73},[37,3400,3401],{"class":39,"line":679},[37,3402,57],{"emptyLinePlaceholder":56},[37,3404,3405],{"class":39,"line":689},[37,3406,3407],{"class":43},"\u002F\u002F ── while(true) with break for polling ──\n",[37,3409,3410,3412,3414,3416],{"class":39,"line":699},[37,3411,1917],{"class":69},[37,3413,118],{"class":73},[37,3415,2843],{"class":171},[37,3417,397],{"class":73},[37,3419,3420,3422,3425,3427,3429,3432],{"class":39,"line":709},[37,3421,1345],{"class":69},[37,3423,3424],{"class":171}," result",[37,3426,236],{"class":69},[37,3428,2640],{"class":69},[37,3430,3431],{"class":77}," checkCondition",[37,3433,2662],{"class":73},[37,3435,3436,3438,3441,3443],{"class":39,"line":719},[37,3437,1807],{"class":69},[37,3439,3440],{"class":73}," (result.done) ",[37,3442,421],{"class":69},[37,3444,656],{"class":73},[37,3446,3447,3450,3453,3455,3458],{"class":39,"line":727},[37,3448,3449],{"class":69},"    await",[37,3451,3452],{"class":77}," sleep",[37,3454,81],{"class":73},[37,3456,3457],{"class":171},"1000",[37,3459,501],{"class":73},[37,3461,3462],{"class":39,"line":737},[37,3463,458],{"class":73},[37,3465,3466],{"class":39,"line":743},[37,3467,57],{"emptyLinePlaceholder":56},[37,3469,3470],{"class":39,"line":748},[37,3471,3472],{"class":43},"\u002F\u002F ── Object lookup for O(1) dispatch (vs switch's O(n)) ──\n",[37,3474,3475,3477,3480,3482],{"class":39,"line":754},[37,3476,230],{"class":69},[37,3478,3479],{"class":171}," operations",[37,3481,236],{"class":69},[37,3483,1053],{"class":73},[37,3485,3486,3489,3491,3494,3496,3499,3501,3503,3506,3508],{"class":39,"line":759},[37,3487,3488],{"class":77},"    add",[37,3490,1198],{"class":73},[37,3492,3493],{"class":241},"a",[37,3495,1232],{"class":73},[37,3497,3498],{"class":241},"b",[37,3500,245],{"class":73},[37,3502,248],{"class":69},[37,3504,3505],{"class":73}," a ",[37,3507,3052],{"class":69},[37,3509,3510],{"class":73}," b,\n",[37,3512,3513,3516,3518,3520,3522,3524,3526,3528,3530,3532],{"class":39,"line":765},[37,3514,3515],{"class":77},"    sub",[37,3517,1198],{"class":73},[37,3519,3493],{"class":241},[37,3521,1232],{"class":73},[37,3523,3498],{"class":241},[37,3525,245],{"class":73},[37,3527,248],{"class":69},[37,3529,3505],{"class":73},[37,3531,196],{"class":69},[37,3533,3510],{"class":73},[37,3535,3536,3539,3541,3543,3545,3547,3549,3551,3553,3555],{"class":39,"line":771},[37,3537,3538],{"class":77},"    mul",[37,3540,1198],{"class":73},[37,3542,3493],{"class":241},[37,3544,1232],{"class":73},[37,3546,3498],{"class":241},[37,3548,245],{"class":73},[37,3550,248],{"class":69},[37,3552,3505],{"class":73},[37,3554,2937],{"class":69},[37,3556,3510],{"class":73},[37,3558,3559,3562,3564,3566,3568,3570,3572,3574,3576,3579],{"class":39,"line":785},[37,3560,3561],{"class":77},"    div",[37,3563,1198],{"class":73},[37,3565,3493],{"class":241},[37,3567,1232],{"class":73},[37,3569,3498],{"class":241},[37,3571,245],{"class":73},[37,3573,248],{"class":69},[37,3575,3505],{"class":73},[37,3577,3578],{"class":69},"\u002F",[37,3580,3510],{"class":73},[37,3582,3583],{"class":39,"line":793},[37,3584,1131],{"class":73},[37,3586,3587,3589,3592,3594,3597,3599,3601,3603,3605],{"class":39,"line":816},[37,3588,600],{"class":69},[37,3590,3591],{"class":77}," calculate",[37,3593,81],{"class":73},[37,3595,3596],{"class":241},"op",[37,3598,1232],{"class":73},[37,3600,3493],{"class":241},[37,3602,1232],{"class":73},[37,3604,3498],{"class":241},[37,3606,397],{"class":73},[37,3608,3609,3611,3613,3616,3619,3622,3625,3627,3629,3631,3633,3636,3638,3640],{"class":39,"line":838},[37,3610,1807],{"class":69},[37,3612,118],{"class":73},[37,3614,3615],{"class":69},"!",[37,3617,3618],{"class":73},"(op ",[37,3620,3621],{"class":69},"in",[37,3623,3624],{"class":73}," operations)) ",[37,3626,1300],{"class":69},[37,3628,1303],{"class":69},[37,3630,1306],{"class":77},[37,3632,81],{"class":73},[37,3634,3635],{"class":84},"`unknown op: ${",[37,3637,3596],{"class":73},[37,3639,1253],{"class":84},[37,3641,501],{"class":73},[37,3643,3644,3646,3649],{"class":39,"line":858},[37,3645,1363],{"class":69},[37,3647,3648],{"class":73}," operations[op](a, b);  ",[37,3650,3651],{"class":43},"\u002F\u002F O(1) lookup\n",[37,3653,3654],{"class":39,"line":863},[37,3655,458],{"class":73},[15,3657,3659],{"id":3658},"️-edge-cases-gotchas","⚠️ Edge Cases & Gotchas",[25,3661,3662],{"language":27},[29,3663,3665],{"className":31,"code":3664,"language":27,"meta":33,"style":33},"\u002F\u002F ── `if ([])` is truthy (empty array is an object → truthy) ──\nif ([]) console.log(\"runs\");  \u002F\u002F prints!  ([] is truthy, not falsy)\nif ({} && \"false\") console.log(\"runs\");  \u002F\u002F prints! (\"false\" is a non-empty string → truthy)\n\n\u002F\u002F ── `switch` without `break` falls through silently ──\n\u002F\u002F ESLint rule `no-fallthrough` catches this, but it's a runtime bug if missed.\n\n\u002F\u002F ── `for...in` iterates string keys (not values), includes prototype ──\nArray.prototype.extra = \"oops\";\nfor (const i in [1, 2, 3]) { console.log(i); }\n\u002F\u002F \"0\", \"1\", \"2\", \"extra\" — prototype property leaked in!\n\u002F\u002F Use for...of for arrays (iterates values, not keys, and ignores prototype).\n\n\u002F\u002F ── `finally` with return overrides try's return ──\nfunction f() { try { return 1; } finally { return 2; } }\nconsole.log(f());  \u002F\u002F 2 (finally's return wins — the try's return value is lost)\n\n\u002F\u002F ── `break` in a nested loop only exits the inner loop ──\nfor (let i = 0; i \u003C 3; i++) {\n    for (let j = 0; j \u003C 3; j++) {\n        if (j === 1) break;  \u002F\u002F only breaks inner loop (outer continues)\n    }\n}\n\u002F\u002F Use labeled break: `break outerLabel;` to exit multiple levels.\n\n\u002F\u002F ── `continue` in a while loop (must update counter BEFORE continue) ──\nlet i = 0;\nwhile (i \u003C 5) {\n    i++;  \u002F\u002F ⚠️ MUST increment BEFORE continue, or infinite loop\n    if (i === 3) continue;  \u002F\u002F skip 3\n    console.log(i);  \u002F\u002F 1 2 4 5\n}\n",[20,3666,3667,3672,3690,3716,3720,3725,3730,3734,3739,3759,3790,3795,3800,3804,3809,3841,3857,3861,3866,3892,3918,3937,3941,3945,3950,3954,3959,3971,3983,3995,4014,4025],{"__ignoreMap":33},[37,3668,3669],{"class":39,"line":40},[37,3670,3671],{"class":43},"\u002F\u002F ── `if ([])` is truthy (empty array is an object → truthy) ──\n",[37,3673,3674,3676,3678,3680,3682,3685,3687],{"class":39,"line":47},[37,3675,70],{"class":69},[37,3677,74],{"class":73},[37,3679,78],{"class":77},[37,3681,81],{"class":73},[37,3683,3684],{"class":84},"\"runs\"",[37,3686,159],{"class":73},[37,3688,3689],{"class":43},"\u002F\u002F prints!  ([] is truthy, not falsy)\n",[37,3691,3692,3694,3697,3700,3703,3705,3707,3709,3711,3713],{"class":39,"line":53},[37,3693,70],{"class":69},[37,3695,3696],{"class":73}," ({} ",[37,3698,3699],{"class":69},"&&",[37,3701,3702],{"class":84}," \"false\"",[37,3704,124],{"class":73},[37,3706,78],{"class":77},[37,3708,81],{"class":73},[37,3710,3684],{"class":84},[37,3712,159],{"class":73},[37,3714,3715],{"class":43},"\u002F\u002F prints! (\"false\" is a non-empty string → truthy)\n",[37,3717,3718],{"class":39,"line":60},[37,3719,57],{"emptyLinePlaceholder":56},[37,3721,3722],{"class":39,"line":66},[37,3723,3724],{"class":43},"\u002F\u002F ── `switch` without `break` falls through silently ──\n",[37,3726,3727],{"class":39,"line":94},[37,3728,3729],{"class":43},"\u002F\u002F ESLint rule `no-fallthrough` catches this, but it's a runtime bug if missed.\n",[37,3731,3732],{"class":39,"line":113},[37,3733,57],{"emptyLinePlaceholder":56},[37,3735,3736],{"class":39,"line":140},[37,3737,3738],{"class":43},"\u002F\u002F ── `for...in` iterates string keys (not values), includes prototype ──\n",[37,3740,3741,3744,3746,3749,3752,3754,3757],{"class":39,"line":164},[37,3742,3743],{"class":171},"Array",[37,3745,2550],{"class":73},[37,3747,3748],{"class":171},"prototype",[37,3750,3751],{"class":73},".extra ",[37,3753,1449],{"class":69},[37,3755,3756],{"class":84}," \"oops\"",[37,3758,656],{"class":73},[37,3760,3761,3763,3765,3767,3769,3771,3773,3775,3777,3779,3781,3783,3785,3787],{"class":39,"line":189},[37,3762,1438],{"class":69},[37,3764,118],{"class":73},[37,3766,230],{"class":69},[37,3768,1852],{"class":171},[37,3770,1695],{"class":69},[37,3772,1409],{"class":73},[37,3774,199],{"class":171},[37,3776,1232],{"class":73},[37,3778,481],{"class":171},[37,3780,1232],{"class":73},[37,3782,1420],{"class":171},[37,3784,1872],{"class":73},[37,3786,78],{"class":77},[37,3788,3789],{"class":73},"(i); }\n",[37,3791,3792],{"class":39,"line":216},[37,3793,3794],{"class":43},"\u002F\u002F \"0\", \"1\", \"2\", \"extra\" — prototype property leaked in!\n",[37,3796,3797],{"class":39,"line":221},[37,3798,3799],{"class":43},"\u002F\u002F Use for...of for arrays (iterates values, not keys, and ignores prototype).\n",[37,3801,3802],{"class":39,"line":227},[37,3803,57],{"emptyLinePlaceholder":56},[37,3805,3806],{"class":39,"line":257},[37,3807,3808],{"class":43},"\u002F\u002F ── `finally` with return overrides try's return ──\n",[37,3810,3811,3813,3816,3819,3821,3823,3825,3827,3830,3832,3834,3836,3838],{"class":39,"line":281},[37,3812,600],{"class":69},[37,3814,3815],{"class":77}," f",[37,3817,3818],{"class":73},"() { ",[37,3820,2121],{"class":69},[37,3822,1297],{"class":73},[37,3824,804],{"class":69},[37,3826,405],{"class":171},[37,3828,3829],{"class":73},"; } ",[37,3831,2128],{"class":69},[37,3833,1297],{"class":73},[37,3835,804],{"class":69},[37,3837,513],{"class":171},[37,3839,3840],{"class":73},"; } }\n",[37,3842,3843,3845,3847,3849,3852,3854],{"class":39,"line":302},[37,3844,260],{"class":73},[37,3846,78],{"class":77},[37,3848,81],{"class":73},[37,3850,3851],{"class":77},"f",[37,3853,2253],{"class":73},[37,3855,3856],{"class":43},"\u002F\u002F 2 (finally's return wins — the try's return value is lost)\n",[37,3858,3859],{"class":39,"line":319},[37,3860,57],{"emptyLinePlaceholder":56},[37,3862,3863],{"class":39,"line":340},[37,3864,3865],{"class":43},"\u002F\u002F ── `break` in a nested loop only exits the inner loop ──\n",[37,3867,3868,3870,3872,3874,3876,3878,3880,3882,3884,3886,3888,3890],{"class":39,"line":345},[37,3869,1438],{"class":69},[37,3871,118],{"class":73},[37,3873,1443],{"class":69},[37,3875,1446],{"class":73},[37,3877,1449],{"class":69},[37,3879,1452],{"class":171},[37,3881,1466],{"class":73},[37,3883,1469],{"class":69},[37,3885,535],{"class":171},[37,3887,2021],{"class":73},[37,3889,1475],{"class":69},[37,3891,397],{"class":73},[37,3893,3894,3896,3898,3900,3902,3904,3906,3908,3910,3912,3914,3916],{"class":39,"line":351},[37,3895,3272],{"class":69},[37,3897,118],{"class":73},[37,3899,1443],{"class":69},[37,3901,1946],{"class":73},[37,3903,1449],{"class":69},[37,3905,1452],{"class":171},[37,3907,2047],{"class":73},[37,3909,1469],{"class":69},[37,3911,535],{"class":171},[37,3913,2054],{"class":73},[37,3915,1475],{"class":69},[37,3917,397],{"class":73},[37,3919,3920,3922,3924,3926,3928,3930,3932,3934],{"class":39,"line":357},[37,3921,2063],{"class":69},[37,3923,1975],{"class":73},[37,3925,2068],{"class":69},[37,3927,405],{"class":171},[37,3929,245],{"class":73},[37,3931,421],{"class":69},[37,3933,450],{"class":73},[37,3935,3936],{"class":43},"\u002F\u002F only breaks inner loop (outer continues)\n",[37,3938,3939],{"class":39,"line":363},[37,3940,740],{"class":73},[37,3942,3943],{"class":39,"line":621},[37,3944,458],{"class":73},[37,3946,3947],{"class":39,"line":633},[37,3948,3949],{"class":43},"\u002F\u002F Use labeled break: `break outerLabel;` to exit multiple levels.\n",[37,3951,3952],{"class":39,"line":647},[37,3953,57],{"emptyLinePlaceholder":56},[37,3955,3956],{"class":39,"line":659},[37,3957,3958],{"class":43},"\u002F\u002F ── `continue` in a while loop (must update counter BEFORE continue) ──\n",[37,3960,3961,3963,3965,3967,3969],{"class":39,"line":669},[37,3962,1443],{"class":69},[37,3964,1446],{"class":73},[37,3966,1449],{"class":69},[37,3968,1452],{"class":171},[37,3970,656],{"class":73},[37,3972,3973,3975,3977,3979,3981],{"class":39,"line":679},[37,3974,1917],{"class":69},[37,3976,1920],{"class":73},[37,3978,1469],{"class":69},[37,3980,2791],{"class":171},[37,3982,397],{"class":73},[37,3984,3985,3988,3990,3992],{"class":39,"line":689},[37,3986,3987],{"class":73},"    i",[37,3989,1475],{"class":69},[37,3991,450],{"class":73},[37,3993,3994],{"class":43},"\u002F\u002F ⚠️ MUST increment BEFORE continue, or infinite loop\n",[37,3996,3997,3999,4001,4003,4005,4007,4009,4011],{"class":39,"line":699},[37,3998,1807],{"class":69},[37,4000,1920],{"class":73},[37,4002,2068],{"class":69},[37,4004,535],{"class":171},[37,4006,245],{"class":73},[37,4008,3160],{"class":69},[37,4010,450],{"class":73},[37,4012,4013],{"class":43},"\u002F\u002F skip 3\n",[37,4015,4016,4018,4020,4022],{"class":39,"line":709},[37,4017,1482],{"class":73},[37,4019,78],{"class":77},[37,4021,3174],{"class":73},[37,4023,4024],{"class":43},"\u002F\u002F 1 2 4 5\n",[37,4026,4027],{"class":39,"line":719},[37,4028,458],{"class":73},[15,4030,4032],{"id":4031},"quick-quiz","🧠 Quick Quiz",[4034,4035,4036],"p",{},"What does this return?",[25,4038,4039],{"language":27},[29,4040,4042],{"className":31,"code":4041,"language":27,"meta":33,"style":33},"function test() {\n    try {\n        throw \"error1\";\n    } catch (e) {\n        throw \"error2\";\n    } finally {\n        return \"finally\";\n    }\n}\ntest();\n",[20,4043,4044,4053,4059,4068,4076,4085,4093,4101,4105,4109],{"__ignoreMap":33},[37,4045,4046,4048,4051],{"class":39,"line":40},[37,4047,600],{"class":69},[37,4049,4050],{"class":77}," test",[37,4052,2154],{"class":73},[37,4054,4055,4057],{"class":39,"line":47},[37,4056,2159],{"class":69},[37,4058,1053],{"class":73},[37,4060,4061,4063,4066],{"class":39,"line":53},[37,4062,2361],{"class":69},[37,4064,4065],{"class":84}," \"error1\"",[37,4067,656],{"class":73},[37,4069,4070,4072,4074],{"class":39,"line":60},[37,4071,2180],{"class":73},[37,4073,2125],{"class":69},[37,4075,2185],{"class":73},[37,4077,4078,4080,4083],{"class":39,"line":66},[37,4079,2361],{"class":69},[37,4081,4082],{"class":84}," \"error2\"",[37,4084,656],{"class":73},[37,4086,4087,4089,4091],{"class":39,"line":94},[37,4088,2180],{"class":73},[37,4090,2128],{"class":69},[37,4092,1053],{"class":73},[37,4094,4095,4097,4099],{"class":39,"line":113},[37,4096,2166],{"class":69},[37,4098,2303],{"class":84},[37,4100,656],{"class":73},[37,4102,4103],{"class":39,"line":140},[37,4104,740],{"class":73},[37,4106,4107],{"class":39,"line":164},[37,4108,458],{"class":73},[37,4110,4111,4114],{"class":39,"line":189},[37,4112,4113],{"class":77},"test",[37,4115,2662],{"class":73},[4117,4118,4119,4123,4128,4156,4181],"details",{},[4120,4121,4122],"summary",{},"Answer",[4034,4124,4125],{},[20,4126,4127],{},"\"finally\"",[4034,4129,4130,4131,4133,4134,4137,4138,4140,4141,4143,4144,4147,4148,4152,4153,4155],{},"Even though the ",[20,4132,2125],{}," block throws ",[20,4135,4136],{},"\"error2\"",", the ",[20,4139,2128],{}," block runs regardless — and ",[20,4142,2128],{}," has its own ",[20,4145,4146],{},"return \"finally\"",", which ",[4149,4150,4151],"strong",{},"overrides the thrown error",". The function returns ",[20,4154,4127],{}," without throwing.",[4034,4157,4158,4159,4161,4162,1232,4164,4166,4167,4169,4170,4172,4173,4175,4176,4178,4179,2550],{},"If ",[20,4160,2128],{}," didn't have a ",[20,4163,804],{},[20,4165,4136],{}," would propagate to the caller. But ",[20,4168,2128],{},"'s ",[20,4171,804],{}," swallows any pending ",[20,4174,1300],{}," from ",[20,4177,2121],{}," or ",[20,4180,2125],{},[4034,4182,4183,801,4186,4188,4189,4191,4192,4194,4195,4197,4198,4175,4200,4202],{},[4149,4184,4185],{},"The lesson",[20,4187,2128],{}," with ",[20,4190,804],{}," is dangerous — it swallows errors from both ",[20,4193,2121],{}," and ",[20,4196,2125],{},". Never ",[20,4199,804],{},[20,4201,2128],{}," unless you intentionally want to override all exit paths.",[4204,4205,4206],"style",{},"html pre.shiki code .sdCPZ, html code.shiki .sdCPZ{--shiki-default:#6A737D;--shiki-github-dark:#6A737D}html pre.shiki code .svdQ7, html code.shiki .svdQ7{--shiki-default:#D73A49;--shiki-github-dark:#F97583}html pre.shiki code .ssxIu, html code.shiki .ssxIu{--shiki-default:#24292E;--shiki-github-dark:#E1E4E8}html pre.shiki code .sIsaT, html code.shiki .sIsaT{--shiki-default:#6F42C1;--shiki-github-dark:#B392F0}html pre.shiki code .sJ6F3, html code.shiki .sJ6F3{--shiki-default:#032F62;--shiki-github-dark:#9ECBFF}html pre.shiki code .snvgF, html code.shiki .snvgF{--shiki-default:#005CC5;--shiki-github-dark:#79B8FF}html pre.shiki code .sCrzJ, html code.shiki .sCrzJ{--shiki-default:#E36209;--shiki-github-dark:#FFAB70}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .github-dark .shiki span {color: var(--shiki-github-dark);background: var(--shiki-github-dark-bg);font-style: var(--shiki-github-dark-font-style);font-weight: var(--shiki-github-dark-font-weight);text-decoration: var(--shiki-github-dark-text-decoration);}html.github-dark .shiki span {color: var(--shiki-github-dark);background: var(--shiki-github-dark-bg);font-style: var(--shiki-github-dark-font-style);font-weight: var(--shiki-github-dark-font-weight);text-decoration: var(--shiki-github-dark-text-decoration);}",{"title":33,"searchDepth":47,"depth":47,"links":4208},[4209,4211,4213,4215,4216,4218,4219,4220,4221],{"id":17,"depth":47,"text":4210},"Truthiness: The ToBoolean Coercion",{"id":369,"depth":47,"text":4212},"switch: Strict Equality and Fall-Through",{"id":884,"depth":47,"text":4214},"Anti-Pattern: switch vs Object Lookup",{"id":1384,"depth":47,"text":1385},{"id":2118,"depth":47,"text":4217},"try \u002F catch \u002F finally: The finally Trap",{"id":2758,"depth":47,"text":2759},{"id":3099,"depth":47,"text":3100},{"id":3658,"depth":47,"text":3659},{"id":4031,"depth":47,"text":4032},"Deep-dive into JavaScript control flow: the ToBoolean coercion table, switch strict equality and fall-through semantics, loop types and engine optimization, labeled breaks, and the try\u002Fcatch\u002Ffinally interaction with return. Code-first reference for senior engineers.","md",{},"\u002Fjs\u002F04-control-flow",{"title":5,"description":4222},"js\u002F04-control-flow","3md1iRtC7q67hS6q3LS4i2Kn5QSPgIG0kwqX5aLuzcc",1789924648993]