Get the FREE Ultimate OpenClaw Setup Guide →
I

JavaScript

Verified

@ivangdavila

npx machina-cli add skill @ivangdavila/javascript --openclaw
Files (1)
SKILL.md
3.2 KB

When 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

TopicFile
Async patternsasync.md
Type coercion rulescoercion.md
Array and object methodscollections.md
Modern ES featuresmodern.md

Equality Traps

  • == coerces: "0" == false is true — use === always
  • NaN !== NaN — use Number.isNaN(), not === NaN
  • typeof null === "object" — check === null explicitly
  • Objects compare by reference — {} === {} is false

this Binding

  • Regular functions: this depends on call site — lost in callbacks
  • Arrow functions: this from lexical scope — use for callbacks
  • setTimeout(obj.method) loses this — use arrow or .bind()
  • Event handlers: this is element in regular function, undefined in arrow (if no outer this)

Closure Traps

  • Loop variable captured by reference — let in loop or IIFE to capture value
  • var hoisted to function scope — creates single binding shared across iterations
  • Returning function from loop: all share same variable — use let per iteration

Array Mutation

  • sort(), reverse(), splice() mutate original — use toSorted(), toReversed(), toSpliced() (ES2023)
  • push(), pop(), shift(), unshift() mutate — spread [...arr, item] for immutable
  • delete arr[i] leaves hole — use splice(i, 1) to remove and reindex
  • Spread and Object.assign are shallow — nested objects still reference original

Async Pitfalls

  • Forgetting await returns Promise, not value — easy to miss without TypeScript
  • forEach doesn't await — use for...of for sequential async
  • Promise.all fails fast — one rejection rejects all, use Promise.allSettled if 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 or toFixed() for display
  • parseInt("08") works now — but parseInt("0x10") is 16, watch prefixes
  • Number("") is 0, Number(null) is 0 — but Number(undefined) is NaN
  • Large integers lose precision over 2^53 — use BigInt for big numbers

Iteration

  • for...in iterates keys (including inherited) — use for...of for values
  • for...of on objects fails — objects aren't iterable, use Object.entries()
  • Object.keys() skips non-enumerable — Reflect.ownKeys() gets all including symbols

Implicit Coercion

  • [] + [] is "" — arrays coerce to strings
  • [] + {} is "[object Object]" — object toString
  • {} + [] is 0 in console — {} parsed as block, not object
  • "5" - 1 is 4, "5" + 1 is "51" — minus coerces, plus concatenates

Strict Mode

  • "use strict" at top of file or function — catches silent errors
  • Implicit globals throw in strict — x = 5 without declaration fails
  • this is undefined in strict functions — not global object
  • Duplicate parameters and with forbidden

Source

git clone https://clawhub.ai/ivangdavila/javascriptView on GitHub

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

  1. Step 1: Review equality traps and coercion rules, and enable strict mode
  2. Step 2: Write a small async function with await, including try/catch for errors
  3. 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

Frequently Asked Questions

Add this skill to your agents
Sponsor this space

Reach thousands of developers