JavaScript
Verified@ivangdavila
npx machina-cli add skill @ivangdavila/javascript --openclawWhen to Use
User needs JavaScript expertise — from core language features to modern patterns. Agent handles async/await, closures, module systems, and ES2023+ features.
Quick Reference
| Topic | File |
|---|---|
| Async patterns | async.md |
| Type coercion rules | coercion.md |
| Array and object methods | collections.md |
| Modern ES features | modern.md |
Equality Traps
==coerces:"0" == falseis true — use===alwaysNaN !== NaN— useNumber.isNaN(), not=== NaNtypeof null === "object"— check=== nullexplicitly- Objects compare by reference —
{} === {}is false
this Binding
- Regular functions:
thisdepends on call site — lost in callbacks - Arrow functions:
thisfrom lexical scope — use for callbacks setTimeout(obj.method)losesthis— use arrow or.bind()- Event handlers:
thisis element in regular function, undefined in arrow (if no outer this)
Closure Traps
- Loop variable captured by reference —
letin loop or IIFE to capture value varhoisted to function scope — creates single binding shared across iterations- Returning function from loop: all share same variable — use
letper iteration
Array Mutation
sort(),reverse(),splice()mutate original — usetoSorted(),toReversed(),toSpliced()(ES2023)push(),pop(),shift(),unshift()mutate — spread[...arr, item]for immutabledelete arr[i]leaves hole — usesplice(i, 1)to remove and reindex- Spread and
Object.assignare shallow — nested objects still reference original
Async Pitfalls
- Forgetting
awaitreturns Promise, not value — easy to miss without TypeScript forEachdoesn't await — usefor...offor sequential asyncPromise.allfails fast — one rejection rejects all, usePromise.allSettledif need all results- Unhandled rejection crashes in Node — always
.catch()or try/catch with await
Numbers
0.1 + 0.2 !== 0.3— floating point, use integer cents ortoFixed()for displayparseInt("08")works now — butparseInt("0x10")is 16, watch prefixesNumber("")is 0,Number(null)is 0 — butNumber(undefined)is NaN- Large integers lose precision over 2^53 — use
BigIntfor big numbers
Iteration
for...initerates keys (including inherited) — usefor...offor valuesfor...ofon objects fails — objects aren't iterable, useObject.entries()Object.keys()skips non-enumerable —Reflect.ownKeys()gets all including symbols
Implicit Coercion
[] + []is""— arrays coerce to strings[] + {}is"[object Object]"— object toString{} + []is0in console —{}parsed as block, not object"5" - 1is 4,"5" + 1is "51" — minus coerces, plus concatenates
Strict Mode
"use strict"at top of file or function — catches silent errors- Implicit globals throw in strict —
x = 5without declaration fails thisis undefined in strict functions — not global object- Duplicate parameters and
withforbidden
Overview
Learn to write robust JavaScript by mastering async patterns, precise type coercion handling, and modern ES2023+ features. It covers core language features, common pitfalls, and practical patterns for correctness, performance, and maintainability.
How This Skill Works
The skill combines explicit rules for async/await usage, strict equality and coercion handling, and immutable data patterns with ES2023+ capabilities. It documents common traps (this binding, closure behavior, and array mutations) and provides concrete patterns (for...of with await, Number.isNaN, and toSorted/toSpliced) to write reliable code.
When to Use It
- Building or maintaining asynchronous JavaScript code using async/await with proper error handling
- Handling tricky type coercion and equality semantics in user input or API data
- Adopting immutable patterns for arrays and objects using ES2023+ methods
- Resolving this binding and closure pitfalls in callbacks, events, or modular code
- Modernizing codebases to leverage ES2023+ features and module systems
Quick Start
- Step 1: Review equality traps and coercion rules, and enable strict mode
- Step 2: Write a small async function with await, including try/catch for errors
- Step 3: Refactor a mutating array example to an immutable version using toSorted/toSpliced and modern ES features
Best Practices
- Prefer strict equality (===) and Number.isNaN() for NaN checks
- Use let/const and appropriate this binding; prefer arrow functions for callbacks
- Favor immutable updates with toSorted, toReversed, and toSpliced over mutation
- Avoid Array.prototype.forEach for async workflows; use for...of with try/catch
- Use Promise.allSettled when aggregating multiple promises and handle rejections
Example Use Cases
- Async data fetch with proper try/catch and error handling using await
- Input normalization with explicit coercion rules to avoid surprise results
- Immutable state updates in a reducer-like pattern using ES2023 helpers
- Event handler with correct this binding using arrow functions or .bind()
- Batch API calls with Promise.allSettled and consolidated result reporting