javascript-code-style
JavaScript Code Style
Use following conventions for JavaScript and TypeScript code.
Preparations
- Add to dev dependencies in package.json if not added:
- eslint-config-metarhia
- eslint, prettier
- Add scripts in package.json if not added:
- "lint": "eslint . && prettier --check "/*.js" "/.json" "**/.md" "*/.ts""
- "fix": "eslint . --fix && prettier --write "/*.js" "/.json" "**/.md" "*/.ts""
- Before and after code analisys with AI run
npm run lintandnpm t - Use
npm run fixif errors/warnings detected to auto-fix when possible
Formatting
- Use single quotes and semicolons
- Keep max line length 80 (ignore URLs)
- Use trailing commas in multiline arrays, objects, and params
- Keep one empty line between semantic blocks
- Follow Prettier and eslint-config-metarhia for spacing, braces, and indentation
Naming
- Use
camelCasefor variables and parameters - Use
UpperCamelCasefor classes and types - Use
UPPER_SNAKE_CASEfor constants - Use
newwith capitalized constructor names - Use
errorin catch blocks, noterr - Use short names (
e,i) only in short one-line callbacks - Use descriptive names in multiline callbacks (
event,index,item) - Use boolean prefixes:
is,has,can,should - Use singular names for entities and plural names for collections
- Use verb names for functions and handlers (
parse,create,handle,on) - Include units in numeric names (
timeoutMs,sizeBytes)
Best practices
- Prefer
const, minimizelet, never usevar - Prefer arrow functions (except prototype/class methods)
- Do not mutate input parameters
- Keep functions small and single-purpose
- Decompose long expressions into intermediate variables
- Prefer explicit loops (
for,for..of) in hot paths - Use array methods when they improve readability
- Use
===and!==only - Keep return types consistent
- Avoid nested ternaries and deep callback nesting
- Self-documented and self-descriptive code: do not add obvious comments, code should be clear without comments
- Use iteration methods like
.map,.filter,.reduceif it is good for code semantic - Try to avoid
.forEachexcept case when passed callback do not read something from outer context
Optimizations
- Keep object shapes stable: same keys, types, and key order
- Change shape only in constructors and creational patterns; avoid mix-ins and
delete - Use shape mutations only for metaprogramming
- Use
nullfor empty reference types; useundefinedfor empty primitives - Avoid array destructuring in assignments and loops; object destructuring is ok
- Keep hot functions monomorphic: stable arg count, types, and return types
- Avoid reading the same property from many unrelated object shapes
- Prefer string or number literals for status/codes; avoid mixing primitives with objects in one variable
- Keep objects that share a property to the same shape; avoid polymorphic hotspots
- Prefer fixed property access (
obj.x) over dynamic keys (obj[key]) in hot paths - Keep arrays dense, avoid holes and mixed element kinds
- Initialize object fields in constructor/factory once and in one order
- Set field to
nullorundefinedinstead ofdeletein hot paths - Move reusable callbacks outside hot loops
- Keep
try/catch, spread/rest, andargumentsaway from hot loops - Use
Mapfor dynamic key dictionaries, plain objects for fixed schemas - Use
Object.create(null)for pure dictionaries - Use typed arrays for numeric and binary workloads
- Reduce GC pressure: reuse arrays, objects, and buffers when safe
More from metarhia/skills
js-gof
Apply Gang of Four and related design patterns in JavaScript and TypeScript. Use when implementing creational, structural, or behavioral patterns, or when the user mentions factories, builder, prototype, flyweight, singleton, object pool, adapter, wrapper, decorator, proxy, bridge, composite, facade, chain of responsibility, command, interpreter, iterator, mediator, memento, EventEmitter, EventTarget, state, strategy, template method, visitor, revealing constructor, actor, service locator, or any other pattern.
2js-data-structures
Implement and use data structures in JavaScript. Use when working with arrays, sets, maps, other collections, queues, lists, trees, graphs, circular buffers, caches, or when the user mentions data structures, BTree, or choosing between Map/Object/Set/Array.
1