A Note About How I am Writing This Book
- The Process
- Chapter Writing Status
- Chapter in Stage 0 - Strawman
- Chapter in Stage 1 - Proposal
- Chapter in Stage 2 - Draft
- Chapter in Stage 3 - Candidate
- Chapter in Stage 4 - Finished
About The Author
About the Technical Reviewers
Prelude
- A Story About Why I Wrote This Book
- Why Should You Care About JavaScript?
- What is the Goal of This Book?
- Why JavaScript-mancy?
- Is This Book For You?
- How is The Book Organized?
- Understanding the Code Samples in This Book
- The REPL is Your Friend!
- A Note About ECMAScript 5 and ECMAScript 6,7 within The Book
- A Note About the Use of Generalizations in This Book
- Do You Have Any Feedback? Found Any Error?
- A Final Word From the Author
- Part I. Mastering the Arcane Art of JavaScript-mancy
Introduction
Once Upon a Time…
- Tome I.I JavaScriptmancy: Getting Started
The Essential Ingredients Of JavaScript-Mancy
- An Introduction to JavaScript-Mancy
- JavaScript
- JavaScript Has Some Types
- Strings in JavaScript
- Functions in JavaScript
- OOP and Objects in JavaScript
- JavaScript Flow Control
- Logical Operators in JavaScript
- Exception Handling
- Regular Expressions
- But Beware, JavaScript Can Be Weird and Dangerous
- Concluding
The Basics Of JavaScript Functions
- The Basics Of Functions
- Functions are the Key
- Function Expressions
- Function Declarations
- Concluding: Prefer Function Declarations and Named Function Expressions
- Exercises
Useful Function Patterns: Default Arguments
- Have You Heard Of Defaults?
- Using Default Arguments in JavaScript Today
- Defaults with Objects
- Native Default Arguments with ECMAScript 6
- Concluding
- Exercises
More Useful Function Patterns: Arbitrary Arguments
- An Arbitrary Number of Arguments
- The Craziness Of Function Arguments in JavaScript
- Functions with Arbitrary Arguments Right Now!
- Array-Like Objects
- Native Arbitrary Arguments with ES6 Rest Parameters
- Concluding
- Exercises
More Useful Function Patterns: Function Overloading
- Have you Heard About The Marvels Of Overloading?
- The Problem with Function Overloading in JavaScript
- How Do We Do Function Overloading Then?
- Function Overloading by Inspecting Arguments
- Using an Options Object
- Relying on ES6 Defaults
- Taking Advantage of Polymorphic Functions
- Concluding
- Exercises
On the Art of Summoning Servants and Critters, Or Understanding The Basics of JavaScript Objects
- An Army of Objects
- Object Initializers (a.k.a. Object Literals)
- JavaScript Arcana: Getters and Setters Are Not Augmenters
- Creating Objects With Factories
- Data Privacy in JavaScript
- ES6 Improves Object Initializers
- ES6 Symbols and Data Privacy
- Concluding
- Exercises
Mysteries of the JavaScript Arcana: JavaScript Quirks and Gotchas Demystified
- A Couple of Tips About JavaScript Quirks and Gotchas
- A Quick Refresher of the JavaScript Arcana 101
- This, Your Most Dangerous Foe
- JavaScript Strict Mode
- Global Scope by Default and Namespacing in JavaScript
- Type Coercion Madness
- Using JavaScript in Strict Mode
- Concluding
- Exercises
A Guide to Strings, Finding the Right Words and Proper Spell Intonation
- Find the Right Words You Must
- The Basic Of Strings
- New String Features in ES6
- String Cheatsheet
- Concluding
- Exercises
Upgrading Your Everyday JavaScript Magic With ECMAScript 6 - Destructuring
- Welcome to the Future! ECMAScript 6
- Destructure All The Things!
- Destructuring Objects
- Destructuring Arrays
- Destructuring Function Arguments
- Concluding
- Exercises
Upgrading Your Everyday JavaScript Magic With ECMAScript 6 - Arrow Functions
- Behold! The Arrow Function!
- Arrow Functions Arcana
- Arrow Functions And This Gotchas
- Arrow Functions Don’t Have Arguments Object
- Arrow Functions and the New and Super Operators
- Concluding
- Exercises
Upgrading Your Everyday JavaScript Magic With ECMAScript 6 - The Spread Operator
- Ready To Spread Your Wings?
- Use the Spread Operator to Seamlessly Concatenate Arrays
- Easily Use Apply With the Spread Operator
- Converting Array-likes and Collections Into Arrays
- Spread Lets You Combine New and Apply
- Concluding
- Exercises
- Tome I.II JavaScriptmancy and Data Structures
JavaScript Arrays: The All-in-one Data Structure
- We’ll Just Need To Make Sense of All These Items
- JavaScript’s Array
- An Extremely Flexible Data Structure
- Sorting Arrays
- Safe Array Methods
- JavaScript Arrays and LINQ
- Other ES6 and ES7 Features
- Array Cheatsheet
- Concluding
- Exercises
Organizing Your Data With ES6 Maps
- Take a Look at These Maps
- JavaScript’s Map
- Iterating Over the Elements of a Map
- Creating a Map From an Iterable Collection
- Map Cheatsheet
- Concluding
- Exercises
Sets, For When There Can Only Be One
- You Are One of a Kind
- Working With Sets
- Iterating Sets
- Using Array Methods With Sets
- How Do Sets Understand Equality?
- Sets Cheatsheet
- Concluding
- Exercises
The Secrets Behind Collections: Enumerables, Iterables, Iterators and Generators
- Chapter in Stage 2 - Draft
- Once Upon a Time There Were Enumerables
- ES6 Brings Real Iterables and Iterators
- A Better Way to Create Iterators: ES6 Generators
- Concluding
- Do Some Research
- Exercises
Weak Maps and Weak Sets
- Chapter in Stage 0 - Strawman
- Weak Maps and Sets
- Concluding
- Do Some Research
- Exercises
- Tome I. Epilogue
- Tome II. JavaScriptmancy and OOP: The Path of The Summoner
Introduction to the Path of Summoning and Commanding Objects (aka OOP)
- Let me Tell You About OOP in JavaScript
- C# Classes in JavaScript
- OOP Beyond Classes
- Combining Classes with Object Composition
- The Path of the Object Summoner Step by Step
- Concluding
Summoning Fundamentals: Encapsulation and Information Hiding
- Let’s get Started With The Basics of OOP!
- Encapsulation: Creating Objects in JavaScript
- Object Initializers
- Constructor Functions and the New Operator
- Data Hiding in JavaScript
- Object Initializers vs Constructor Functions
- Object Factories vs Constructor Functions
- Concluding
- Exercises
Summoning Fundamentals: Prototypical Inheritance
- You Don’t Repeat Yourself. Inheritance!
- Classical Inheritance vs Prototypical Inheritance
- What About ES6 Classes?
- JavaScript Prototypical Inheritance
- Object Prototypes
- Object Prototypes with Object.Create or OLOO
- Defining Prototypes with Constructor Functions
- Creating Longer Prototype Chains
- What About Concatenative Protypical Inheritance?
- Object Initializers vs Object.create vs Constructor Functions
- Concluding
- Exercises
Summoning Fundamentals: Polymorphism
- Polymorphism Means Many Forms
- Polymorphism in C#
- Polymorphism in JavaScript
- Concluding
- Exercises
White Tower Summoning: Mimicking C# Classical Inheritance in JavaScript
- Ever Heard of Classical Inheritance?
- Can I Just Jump Over to the ES6 Class Chapter Directly?
- Emulating a C# Class in JavaScript
- Constructor Function + Prototype = Class
- Mimicking Classical Inheritance in JavaScript
- Simplifying Classical Inheritance in ES5
- Concluding
- Exercises
White Tower Summoning Enhanced: The Marvels of ES6 Classes
- Create These Units Faster with ES6 Classes!
- From ES5 “Classes” to ES6 Classes
- Prototypical Inheritance via Extends
- Overriding Methods in ES6 Classes
- Static Members and Methods
- ES6 Classes and Information Hiding
- ES6 Classes Behind the Curtain
- Concluding
- Exercises
Black Tower Summoning: Objects Interweaving Objects with Mixins
- The Problem With Classes and Classical Inheritance…
- Free Yourself From Classes With Object Composition and Mixins
- Limitations of Mixins as Objects
- Functional Mixins
- Combining Mixins with ES6 Classes
- Object.assign in Depth
- Enumerable Properties?
- Object.assign Alternatives for ES5 JavaScript-mancers
- Concluding
- Exercises
Black Tower Summoning: Safer Object Composition with Traits
- An Improvement Over Mixins
- Traits
- Traits with traits.js
- Composing Traits
- What Happens When You Miss Required Properties?
- Assigning to Read-only Properties Only Throws in Strict Mode
- Resolving Name Conflicts
- Traits and Data Privacy
- High Integrity Objects With Immutable Traits
- Traits vs Mixins
- Concluding
- Exercises
Black Tower Summoning: Next Level Object Composition With Stamps
- I Call Them Stamps
- What are Stamps?
- Stamps OOP Embraces JavaScript
- Stamps By Example
- Stamp Composition
- Stamp Fluent API
- Concluding: Stamps vs Mixins vs Traits
- Exercises
Object Internals: The Secrets of Objects
- A Nifty Trick… Object Internals
- All your Objects Are Belong to
Object - Defining Properties with Object.defineProperty
- Defining Multiple Properties with Object.defineProperties
- Beautiful Property Manipulation with ESnext Decorators
- Class And Method Decorators
- Create Objects With Object.create And Property Descriptors
- Metaprogramming
- Other Useful Object Methods
- Concluding
- Exercises
More Metaprogramming with Reflect, Proxies and Symbols
- How Good Are You at Reflection?
- ES6 Reflect
- Reflection? What is reflection?
- ES6 Proxies
- ES6 Symbols and Meta-programming
- Concluding
- Exercises
TypeScript
- You Shall Only Use Types!
- JavaScript + Types = Awesome Dev Productivity
- Any JavaScript is Valid TypeScript
- So, What Are The Advantages and Disadvantages of TypeScript?
- Setting up a Simple TypeScript project
- Cool TypeScript Features
- Type Annotations In TypeScript
- Working with TypeScript in Real World Applications
- Concluding
- Exercises
- Tome II. Epilogue
- Tome III. JavaScriptmancy and FP: The path of the Functional Programeer
Basics of Functional Programming in JavaScript
- Chapter in Stage 2 - Draft
- Functional Programming and JavaScript
- What is Functional Programming?
- Why Should You Care About Functional Programming?
- Functions As First Class Citizens
- What are Higher-order Functions?
- Pure Functions
- Closures
- Immutability
- Concluding
- Do Some Research
- Exercises
Functional Programming: Using LINQ in JavaScript
- Chapter in Stage 2 - Draft
- The Magic of LINQ
- Functional and Applicative Programming in JavaScript
- LINQ with Array Prototype Functions
- Array.Prototype LINQ-Like Methods CheatSheet
- LINQ Deferred Execution with ES6 Generators
- Can’t Remember ES6 Generators?
- Filling in the Gaps with JavaScript Libraries
- Concluding
- Appendix. LINQ Query Syntax with ES.Next Comprenhensions
- Rebel Alert. Feature Removed in ES6
- Do Some Research!
- Exercises
An Underscore Primer
Function Composition in JavaScript
- Chapter in Stage 0 - Strawman
- Functions Programming is All About Functions
- The Forgotten Art of The Function
- Partial Application
- Partial Application with Bind
- Currying
- Composition with Compose…
- ES.next Decorators
- Considerations When Composing Class Methods
- Partial Application
- Do Some Research
- Exercises
Object Oriented Programming Futures: Decorators
- Chapter in Stage 0 - Strawman
- ESNext Class and Property Decorators
- ESNext Warning: Class Decorators is an Early Proposal
- Concluding
- Do Some Research
- Exercises
Immutability in JavaScript
- Making Objects Immutable
Functional Programming In Real World Applications
- Chapter in Stage 0 - Strawman
- Functional Programming in the Real World
- Do Some Research
- Exercises
- Tome IV. Architecture and Patterns
Organizing Your JavaScript Code With Modules
- IIFE
CommonJS Modules
- Node.js and CommonJs modules
AMD Modules - Async Module Definition
- AMD basics
ES6 Modules
Composing Applications With Modules
- Direct dependencies
- Tome V. Async: The Path of the Time Traveller
The Basics of Asynchronous Programming in JavaScript
- Introduction
Async With Promises
Async with Async/Await
Async With Reactive Programming
- Chapter in Stage 0 - Strawman
- JavaScript and Async
- An Example Before You Go Crazy With All This Bla Bla Bla
- A Better Async Pattern: Observables and Asynchronous Data Streams
- A Super Simple Intro to Observables: Like an Array But Different
- The Power of a One Single Abstraction
- Side-Effects of Using Rx.js
- Want to Learn More?
- Concluding
Reactive Programming Part II
- Chapter in Stage 0 - Strawman
- That Light Bulb Moment
- Take a Look at This Introduction to Rx.js
- Building the Game Step by Step - Part I
- Concluding Part I
- The Web Speech API
- Using Annyang to Gather Player Input
- Why didn’t We Include userWords$ in the Original game$ Observable?
- Adding Scores
- Wait… There’s Something Weird Happening? Every time I say a word I get 200 points! Wat!??
- Cold and Hot Observables
- Concluding
- Would you Like to Learn More About The Web Speech API and Rx.js?
- A Quick Recap
- Time To Make Things More Exciting
- Adding Some Styling and Graphics
- Experimenting With the Web Speech Synthesis API
- Time To Do Some CleanUp!
- Concluding
- What Next?
- Part II. The Magic Realm of JavaScript
A Short History Of JavaScript
- Chapter in Stage 0 - Strawman
Elevate your Front-end Development Workflow With Yeoman
- Chapter in Stage 0 - Strawman
- What is Yeoman?
- Setting Up Yeoman
- Creating Some Apps
- Summary
Automate Your Front-end Workflow With Gulp
- Chapter in Stage 0 - Strawman
- Getting Started With Gulp
- Running ES6 With Gulp
- What is Babel?
- Using Gulp and Babel to Transpile ES6
- Summary!
Webpack
- Chapter in Stage 0 - Strawman
Testing
- Chapter in Stage 0 - Strawman
- Part III. Building a Modern JavaScript Application With Angular 2
An Introduction to Modern Web Development
- Chapter in Stage 0 - Strawman
Your First Angular Component
- Chapter in Stage 0 - Strawman
- Why Should You Care About Angular?
- Is Angular Ready?
- The Code Samples
- Getting Started With Angular and TypeScript
- Index.html The Entry Point for Your App
- Bootstrapping Your App
- Wait… But What is an Angular Module? I Thought We Were Just Using ES6 Modules in Angular!
- But What is a Component?
- Your First Component, Listing Star Wars People Of Note!
- Concluding
Refactoring to Services
- Chapter in Stage 0 - Strawman
- The Code Samples
- Our People List Component Right Now
- What is an Angular Service?
- Creating The PeopleService
- Injecting Our People Service in The People List Component
- Registering Your Service With Angular
- You Can Also Register Services at the Module Level
- The Angular Cli Can Help You With Registering! Yey!
- Taking Advantage of Angular Component Lifecycle
- Enabling Dependency Injection in Your Service
- Want to Know More About Angular Dependency Injection?
- Concluding
Your Second Component and Angular Data Biding
- Chapter in Stage 0 - Strawman
- The Code Samples
- A Person Details Component
- Our People List Component Right Now
- Showing Person Details When Clicking on a Character
- What Are Angular Event Bindings?
- Extracting Person Details Into Its Own Component
- What are Angular Property Bindings?
- Want to Learn more about Angular Data Bindings?
- Concluding
Angular Routing
- Chapter in Stage 0 - Strawman
- The Code Samples
- Our Application So Far
- Enter Angular Routing
- Setting up the PeopleList Route
- An Aside: Not Using the CLI?
- Setting up the PersonDetails Route
- Creating Route Links
- Extracting Parameters From Routes
- Going Back to the People List
- Using The Angular CLI to Generate Your Routes
- Extracting Your Routes Into A Separate Module
- Want to Learn More About Angular Routing?
- Concluding
Angular Forms and Validation
- Chapter in Stage 0 - Strawman
- The Code Samples
- Our Application Up Until Now
- We Want to Save Our Own Data!
- First Things First! We Need to Add The Forms Module to Our App!
- Using a File Template Instead of an Inline Template
- A Basic Form in Angular
- ngModel and Angular Two-Way Data Binding
- A Review of Angular Data Bindings
- Adding Validation to Our Form
- Custom Validation FTW!
- Submitting Our Form
- Saving Information
- What’s With NgModel and NgForm?
- Bonus Exercise. Adding a Select Input in Angular
- Do You Want to Learn More About Forms?
- Concluding
- An Aside: Oh No! I Haven’t Had Time To Update To The New Forms API! Can I Update to RC5?
Consuming Real Data With Http
- Chapter in Stage 0 - Strawman
- The Code Samples
- Our Application Up Until Now
- Let’s Get Some Real Data For Our App!
- Enabling The Http Module In Your App
- Let’s Get Started Using The Http Module To Get Stuff From The Interwebs!
- Error Handling with Observables
- The Async Pipe
- Converting Observables to Promises
- Want to Learn More About Angular HTTP and RxJS?
- Concluding
Styling Angular Components
- Chapter in Stage 0 - Strawman
The Angular CLI in Depth
- Chapter in Stage 0 - Strawman
Managing State in Angular Applications
- Chapter in Stage 0 - Strawman
Angular And Rx.js
- Chapter in Stage 0 - Strawman
Angular Animations
- Chapter in Stage 0 - Strawman
Angular Testing
- Chapter in Stage 0 - Strawman
Angular Material
- Chapter in Stage 0 - Strawman
- References and Appendix
References
- Specifications
- Books
Appendix A. Setting Up Your Developing Environment For ES6
- Using ES6 with Node.js
- ES6 and Modern Browsers
- Real-World ES6 Development Environments
