- Operators, operands, operator precedence (unary, binary, ternary)
- Dynamic Type system: types and conversion
- Value type vs. Reference type
- Expression vs. Statement
- Scope
- Hoisting
- Overloading
- Prototypal inheritance vs. Classical inheritance
- Instancing
new
&this
keywords, and theinstanceof
operator
- Constructor vs. Factory function
- Instancing
- Execution context,
.call()
,.apply()
,.bind()
- Asynchronous programming:
- Event loop
- Concurrency
- Call-stack
- Blocking
- Regular Expressions
- Program to an Interface, not an Implementation
- Favor composition over inheritance
- Refactoring workflow. Time spent = 80% refactoring, 20% new feature
- SOLID:
- Single responsibility
- Open/closed
- Liskov substitution
- Interface segregation
- Dependency inversion
- YAGNI - You ain't gonna need it
- Loose coupled vs. Tight coupled
- DRY - Don’t repeat yourself
- KISS - Keep it simple, stupid
- Different paradigms
- Concepts:
- Indirection
- Two-way data binding
- One-way data flow
- Duck typing
- Inheritance vs. Composition
- Getters & Setters
- Design Patterns:
- Module patterns:
- IIFE
- Module Pattern
- AMD
- ES6 Modules
- Singleton
- Factory
- Decorator
- Composite
- Strategy
- MVC, MVP & MVVM
- Module patterns:
- Referential transparency
- Immutability
- Special functions:
- First-class function
- Pure function
- Closure function
- Higher-order function
- Recursive function
- Currying / Partial application
- Composition
- Point-free style
- Category Theory
- Design Patterns:
- Lenses
- Functors
- Array
- Maybe
- Either
- Applicatives, Monads
- IO
- Future
- Promise
- Design Patterns:
- Observer / EventEmitter
- Pub/Sub (global Observer)
- Mediator
- EventStream / Observable
- Unit test vs. Integration test vs. Functional test
- Design Patterns:
- Arrange–Act–Assert
- Stubs & Mocks
- Spies
- Fixtures
- Related Design Patterns:
- Dependency Injection / Inversion of Control (DI/IoC)
- Facade
- Monolithic vs. Microservices
- Build tools
- IDE's & Integration