100% found this document useful (1 vote)
28 views65 pages

Understanding ECMAScript 6 The Definitive Guide For Javascript Developers 1st Edition Nicholas C. Zakas 2024 Scribd Download

Nicholas

Uploaded by

radiorobbeg7
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
100% found this document useful (1 vote)
28 views65 pages

Understanding ECMAScript 6 The Definitive Guide For Javascript Developers 1st Edition Nicholas C. Zakas 2024 Scribd Download

Nicholas

Uploaded by

radiorobbeg7
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 65

Download the Full Version of textbook for Fast Typing at textbookfull.

com

Understanding ECMAScript 6 The definitive guide


for Javascript developers 1st Edition Nicholas C.
Zakas

https://textbookfull.com/product/understanding-
ecmascript-6-the-definitive-guide-for-javascript-
developers-1st-edition-nicholas-c-zakas/

OR CLICK BUTTON

DOWNLOAD NOW

Download More textbook Instantly Today - Get Yours Now at textbookfull.com


Recommended digital products (PDF, EPUB, MOBI) that
you can download immediately if you are interested.

Beginning Functional JavaScript. Functional Programming


with JavaScript using EcmaScript 6 1st Edition Anto
Aravinth
https://textbookfull.com/product/beginning-functional-javascript-
functional-programming-with-javascript-using-ecmascript-6-1st-edition-
anto-aravinth/
textboxfull.com

Beginning Functional JavaScript: Functional Programming


with JavaScript Using EcmaScript 6 1st Edition Anto
Aravinth
https://textbookfull.com/product/beginning-functional-javascript-
functional-programming-with-javascript-using-ecmascript-6-1st-edition-
anto-aravinth-2/
textboxfull.com

JavaScript The Definitive Guide 7th Edition David Flanagan

https://textbookfull.com/product/javascript-the-definitive-guide-7th-
edition-david-flanagan/

textboxfull.com

iOS Application Security The Definitive Guide for Hackers


and Developers 1st Edition David Thiel

https://textbookfull.com/product/ios-application-security-the-
definitive-guide-for-hackers-and-developers-1st-edition-david-thiel/

textboxfull.com
The Definitive Guide to AdonisJs: Building Node.js
Applications with JavaScript Christopher Pitt

https://textbookfull.com/product/the-definitive-guide-to-adonisjs-
building-node-js-applications-with-javascript-christopher-pitt/

textboxfull.com

JavaScript Essentials for SAP ABAP Developers: A Guide to


Mobile and Desktop Application Development 1st Edition
Rehan Zaidi (Auth.)
https://textbookfull.com/product/javascript-essentials-for-sap-abap-
developers-a-guide-to-mobile-and-desktop-application-development-1st-
edition-rehan-zaidi-auth/
textboxfull.com

JavaScript on Things: Hacking hardware for web developers


Lyza Danger Gardner

https://textbookfull.com/product/javascript-on-things-hacking-
hardware-for-web-developers-lyza-danger-gardner/

textboxfull.com

Understanding Compression Data Compression for Modern


Developers 1st Edition Colt Mcanlis

https://textbookfull.com/product/understanding-compression-data-
compression-for-modern-developers-1st-edition-colt-mcanlis/

textboxfull.com

Beginning Functional JavaScript: Uncover the Concepts of


Functional Programming with EcmaScript 8 2nd Edition
Srikanth Machiraju
https://textbookfull.com/product/beginning-functional-javascript-
uncover-the-concepts-of-functional-programming-with-ecmascript-8-2nd-
edition-srikanth-machiraju/
textboxfull.com
LEVEL UP
YOUR
JAVASCRIPT

UNDE RS TA NDING ECM A SCR IP T 6


ECMAScript 6 represents the biggest update to the • How to improve asynchronous programming with
core of JavaScript in the history of the language. promises
In Understanding ECMAScript 6, expert developer
• How modules change the way you organize code
Nicholas C. Zakas provides a complete guide to the
object types, syntax, and other exciting changes Whether you’re a web developer or a Node.js
that ECMAScript 6 brings to JavaScript. Every chap- developer, you’ll find Understanding ECMAScript 6
ter is packed with example code that works in any indispensable on your journey from ECMAScript 5
JavaScript environment so you’ll be able to see new to ECMAScript 6.
features in action. You’ll learn:
ABOUT THE AUTHOR
• How ECMAScript 6 class syntax relates to more
Nicholas C. Zakas has been working on web appli-
familiar JavaScript concepts
cations since 2000, focusing on frontend develop-
• What makes iterators and generators useful ment, and is known for writing and speaking about
frontend best practices. He honed his experience
• How arrow functions differ from regular functions
during his five years at Yahoo!, where he was principal
• Ways to store data with sets, maps, and more frontend engineer for the Yahoo! home page. He is
the author of several books, including The Principles
• The power of inheritance
of Object-Oriented JavaScript (No Starch Press) and
Professional JavaScript for Web Developers (Wrox).

T H E F I N E ST I N G E E K E N T E RTA I N M E N T ™
w w w.nostarch.com
ZAKAS

“ I L I E F L AT .” $34.95 ($40.95 CDN)


This book uses a durable binding that won’t snap shut.
JAVASCRIPT
PROGRAMMING LANGUAGES/
SHELVE IN:

FSC FPO
Understanding ECMASCript 6
Understanding
E C M AS C r i p t 6
The Definitive Guide for
JavaScript Developers

b y Ni ch ol a s C . Za ka s

San Francisco
Understanding ECMASCript 6. Copyright © 2016 by Nicholas C. Zakas.

All rights reserved. No part of this work may be reproduced or transmitted in any form or by any means,
electronic or mechanical, including photocopying, recording, or by any information storage or retrieval
system, without the prior written permission of the copyright owner and the publisher.

Printed in USA

First printing

20 19 18 17 16   1 2 3 4 5 6 7 8 9

ISBN-10: 1-59327-757-1
ISBN-13: 978-1-59327-757-4

Publisher: William Pollock


Production Editor: Alison Law
Cover Illustration: Garry Booth
Interior Design: Octopod Studios
Developmental Editor: Jennifer Griffith-Delgado
Technical Reviewer: Juriy Zaytsev
Copyeditor: Anne Marie Walker
Proofreader: James Fraleigh
Indexer: BIM Creatives, LLC

For information on distribution, translations, or bulk sales, please contact No Starch Press, Inc. directly:

No Starch Press, Inc.


245 8th Street, San Francisco, CA 94103
phone: 415.863.9900; [email protected]
www.nostarch.com

Library of Congress Cataloging-in-Publication Data


A catalog record of this book is available from the Library of Congress.

No Starch Press and the No Starch Press logo are registered trademarks of No Starch Press, Inc. Other
product and company names mentioned herein may be the trademarks of their respective owners. Rather
than use a trademark symbol with every occurrence of a trademarked name, we are using the names only
in an editorial fashion and to the benefit of the trademark owner, with no intention of infringement of the
trademark.

The information in this book is distributed on an “As Is” basis, without warranty. While every precaution
has been taken in the preparation of this work, neither the author nor No Starch Press, Inc. shall have any
liability to any person or entity with respect to any loss or damage caused or alleged to be caused directly or
indirectly by the information contained in it.
About the Author
Nicholas C. Zakas has been working on web applications since 2000,
focusing on frontend development, and is known for writing and speak-
ing about frontend best practices. He honed his experience during
his five years at Yahoo!, where he was principal frontend engineer for
the Yahoo! home page. He is the author of several books, including
The Principles of Object-Oriented JavaScript (No Starch Press, 2014) and
Professional JavaScript for Web Developers (Wrox, 2012).

About the Technical Reviewer


Juriy Zaytsev (known online as kangax) is a frontend web developer
based in New York. He’s been exploring and writing about the quirky
nature of JavaScript since 2007. Juriy has contributed to several open
source projects, including Prototype.js and other popular projects like
his own Fabric.js. He co-founded an on-demand custom print service
called printio.ru and currently works at Facebook.
Brief Contents

Foreword by Dan Abramov . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xvii

Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xix

Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxi

Chapter 1: Block Bindings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

Chapter 2: Strings and Regular Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

Chapter 3: Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35

Chapter 4: Expanded Object Functionality . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67

Chapter 5: Destructuring for Easier Data Access . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83

Chapter 6: Symbols and Symbol Properties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99

Chapter 7: Sets and Maps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119

Chapter 8: Iterators and Generators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137

Chapter 9: Introducing JavaScript Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165

Chapter 10: Improved Array Capabilities . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191

Chapter 11: Promises and Asynchronous Programming . . . . . . . . . . . . . . . . . . . . . . . . . . 213

Chapter 12: Proxies and the Reflection API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243

Chapter 13: Encapsulating Code with Modules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283

Appendix A: Minor Changes in ECMAScript 6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299

Appendix B: Understanding ECMAScript 7 (2016) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305

Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311
Conte nt s in De ta il

Foreword by Dan Abramov xvii

acknowledgments xix

Introduction xxi
The Road to ECMAScript 6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxi
About This Book . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxii
Browser and Node.js Compatibility . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxiii
Who This Book Is For . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxiii
Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxiii
Conventions Used . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxiv
Help and Support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxv

1
Block Bindings 1
var Declarations and Hoisting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
Block-Level Declarations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
let Declarations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
No Redeclaration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
const Declarations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
The Temporal Dead Zone . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Block Bindings in Loops . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Functions in Loops . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
let Declarations in Loops . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
const Declarations in Loops . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
Global Block Bindings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
Emerging Best Practices for Block Bindings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

2
Strings and Regular Expressions 13
Better Unicode Support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
UTF-16 Code Points . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
The codePointAt() Method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
The String.fromCodePoint() Method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
The normalize() Method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
The Regular Expression u Flag . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
Other String Changes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
Methods for Identifying Substrings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
The repeat() Method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
Other Regular Expression Changes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
The Regular Expression y Flag . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
Duplicating Regular Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
The flags Property . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
Template Literals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
Basic Syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
Multiline Strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
Making Substitutions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
Tagged Templates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32

3
Functions 35
Functions with Default Parameter Values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
Simulating Default Parameter Values in ECMAScript 5 . . . . . . . . . . . . . . . . . . 36
Default Parameter Values in ECMAScript 6 . . . . . . . . . . . . . . . . . . . . . . . . . . 37
How Default Parameter Values Affect the arguments Object . . . . . . . . . . . . . . 38
Default Parameter Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
Default Parameter TDZ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
Working with Unnamed Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
Unnamed Parameters in ECMAScript 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
Rest Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
Increased Capabilities of the Function Constructor . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
The Spread Operator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
The name Property . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
Choosing Appropriate Names . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
Special Cases of the name Property . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
Clarifying the Dual Purpose of Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
Determining How a Function Was Called in ECMAScript 5 . . . . . . . . . . . . . . . 50
The new.target Metaproperty . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
Block-Level Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
Deciding When to Use Block-Level Functions . . . . . . . . . . . . . . . . . . . . . . . . . 53
Block-Level Functions in Non-Strict Mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
Arrow Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
Arrow Function Syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
Creating Immediately Invoked Function Expressions . . . . . . . . . . . . . . . . . . . . 57
No this Binding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
Arrow Functions and Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
No arguments Binding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
Identifying Arrow Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
Tail Call Optimization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
How Tail Calls Are Different in ECMAScript 6 . . . . . . . . . . . . . . . . . . . . . . . . 62
How to Harness Tail Call Optimization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64

4
Expanded Object Functionality 67
Object Categories . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
Object Literal Syntax Extensions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
Property Initializer Shorthand . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
Concise Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
Computed Property Names . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70

x   Contents in Detail
New Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
The Object.is() Method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
The Object.assign() Method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
Duplicate Object Literal Properties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
Own Property Enumeration Order . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
Enhancements for Prototypes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
Changing an Object’s Prototype . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
Easy Prototype Access with Super References . . . . . . . . . . . . . . . . . . . . . . . . 77
A Formal Method Definition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81

5
Destructuring for Easier Data Access 83
Why Is Destructuring Useful? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
Object Destructuring . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
Destructuring Assignment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
Default Values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
Assigning to Different Local Variable Names . . . . . . . . . . . . . . . . . . . . . . . . . 87
Nested Object Destructuring . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
Array Destructuring . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
Destructuring Assignment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
Default Values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
Nested Array Destructuring . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
Rest Items . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
Mixed Destructuring . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
Destructured Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
Destructured Parameters Are Required . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
Default Values for Destructured Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . 96
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97

6
Symbols and Symbol Properties 99
Creating Symbols . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
Using Symbols . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
Sharing Symbols . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
Symbol Coercion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
Retrieving Symbol Properties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
Exposing Internal Operations with Well-Known Symbols . . . . . . . . . . . . . . . . . . . . . . 105
The Symbol.hasInstance Method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
The Symbol.isConcatSpreadable Property . . . . . . . . . . . . . . . . . . . . . . . . . . 107
The Symbol.match, Symbol.replace, Symbol.search, and
Symbol.split Properties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
The Symbol.toPrimitive Method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
The Symbol.toStringTag Property . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
The Symbol.unscopables Property . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117

Contents in Detail   xi
7
Sets and Maps 119
Sets and Maps in ECMAScript 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
Problems with Workarounds . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
Sets in ECMAScript 6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
Creating Sets and Adding Items . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
Removing Items . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
The forEach() Method for Sets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
Converting a Set to an Array . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
Weak Sets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
Maps in ECMAScript 6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
Map Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
Map Initialization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
The forEach() Method for Maps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
Weak Maps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136

8
Iterators and Generators 137
The Loop Problem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
What Are Iterators? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
What Are Generators? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
Generator Function Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
Generator Object Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
Iterables and for-of Loops . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
Accessing the Default Iterator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
Creating Iterables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
Built-In Iterators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
Collection Iterators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
String Iterators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
NodeList Iterators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
The Spread Operator and Nonarray Iterables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
Advanced Iterator Functionality . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
Passing Arguments to Iterators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
Throwing Errors in Iterators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
Generator Return Statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
Delegating Generators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156
Asynchronous Task Running . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
A Simple Task Runner . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
Task Running with Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160
An Asynchronous Task Runner . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164

9
Introducing JavaScript Classes 165
Class-Like Structures in ECMAScript 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166
Class Declarations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166
A Basic Class Declaration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166
Why Use the Class Syntax? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167

xii   Contents in Detail
Class Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169
A Basic Class Expression . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169
Named Class Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
Classes as First-Class Citizens . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172
Accessor Properties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
Computed Member Names . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174
Generator Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
Static Members . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176
Inheritance with Derived Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
Shadowing Class Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180
Inherited Static Members . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181
Derived Classes from Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181
Inheriting from Built-Ins . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184
The Symbol.species Property . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
Using new.target in Class Constructors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189

10
Improved Array Capabilities 191
Creating Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
The Array.of() Method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
The Array.from() Method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193
New Methods on All Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196
The find() and findIndex() Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196
The fill() Method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197
The copyWithin() Method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197
Typed Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198
Numeric Data Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199
Array Buffers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199
Manipulating Array Buffers with Views . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
Similarities Between Typed and Regular Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207
Common Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207
The Same Iterators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208
The of() and from() Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208
Differences Between Typed and Regular Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209
Behavioral Differences . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209
Missing Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210
Additional Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212

11
Promises and Asynchronous Programming 213
Asynchronous Programming Background . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214
The Event Model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214
The Callback Pattern . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215
Promise Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217
The Promise Life Cycle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217
Creating Unsettled Promises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219
Creating Settled Promises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221
Executor Errors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224

Contents in Detail   xiii
Global Promise Rejection Handling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224
Node.js Rejection Handling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225
Browser Rejection Handling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227
Chaining Promises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228
Catching Errors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229
Returning Values in Promise Chains . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230
Returning Promises in Promise Chains . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231
Responding to Multiple Promises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233
The Promise.all() Method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234
The Promise.race() Method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235
Inheriting from Promises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236
Promise-Based Asynchronous Task Running . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241

12
Proxies and the Reflection API 243
The Array Problem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244
Introducing Proxies and Reflection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244
Creating a Simple Proxy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245
Validating Properties Using the set Trap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246
Object Shape Validation Using the get Trap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247
Hiding Property Existence Using the has Trap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249
Preventing Property Deletion with the deleteProperty Trap . . . . . . . . . . . . . . . . . . . . . . 250
Prototype Proxy Traps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252
How Prototype Proxy Traps Work . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252
Why Two Sets of Methods? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254
Object Extensibility Traps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255
Two Basic Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255
Duplicate Extensibility Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256
Property Descriptor Traps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257
Blocking Object.defineProperty() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258
Descriptor Object Restrictions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259
Duplicate Descriptor Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260
The ownKeys Trap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261
Function Proxies with the apply and construct Traps . . . . . . . . . . . . . . . . . . . . . . . . . . 262
Validating Function Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264
Calling Constructors Without new . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265
Overriding Abstract Base Class Constructors . . . . . . . . . . . . . . . . . . . . . . . . 266
Callable Class Constructors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267
Revocable Proxies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268
Solving the Array Problem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269
Detecting Array Indexes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270
Increasing length When Adding New Elements . . . . . . . . . . . . . . . . . . . . . . 270
Deleting Elements When Reducing length . . . . . . . . . . . . . . . . . . . . . . . . . . 272
Implementing the MyArray Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273
Using a Proxy as a Prototype . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275
Using the get Trap on a Prototype . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276
Using the set Trap on a Prototype . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277
Using the has Trap on a Prototype . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278
Proxies as Prototypes on Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282

xiv   Contents in Detail
13
Encapsulating Code with Modules 283
What Are Modules? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283
Basic Exporting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284
Basic Importing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285
Importing a Single Binding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286
Importing Multiple Bindings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286
Importing an Entire Module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286
A Subtle Quirk of Imported Bindings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288
Renaming Exports and Imports . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288
Default Values in Modules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289
Exporting Default Values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289
Importing Default Values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290
Re-exporting a Binding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291
Importing Without Bindings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292
Loading Modules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293
Using Modules in Web Browsers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293
Browser Module Specifier Resolution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298

A
Minor Changes in ECMAScript 6 299
Working with Integers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299
Identifying Integers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 300
Safe Integers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 300
New Math Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301
Unicode Identifiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302
Formalizing the __proto__ Property . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303

B
Understanding ECMAScript 7 (2016) 305
The Exponentiation Operator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 306
Order of Operations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 306
Operand Restriction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 306
The Array.prototype.includes() Method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 307
How to Use Array.prototype.includes() . . . . . . . . . . . . . . . . . . . . . . . . . . . . 307
Value Comparison . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 308
A Change to Function-Scoped Strict Mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 308

Index 311

Contents in Detail   xv
Fore word

ECMAScript 6 has taken the world by storm. It came long after people
stopped waiting for it, and then it spread faster than most people could
learn it. Everybody has a different story about it. Here is mine.
In 2013, I worked at a startup that pivoted from iOS to the web. It was
before I co-created Redux or participated in the JavaScript open source
community. At the time, I was struggling to learn web development, and
I was terrified. My team had to build a web version of our product from
scratch in just a few months. In JavaScript.
At first I scoffed at the idea of writing something large in JavaScript.
But a new team member persuaded me that JavaScript was not a toy lan-
guage. I agreed to give it a try. I set my prejudices aside, opened MDN and
StackOverflow, and learned JavaScript in depth for the first time. The sim-
plicity I discovered enchanted me. My colleague also taught me how to use
tools such as a linter and a bundler. In a few weeks, I woke up and realized
that I enjoyed writing JavaScript.
But no language is perfect. I missed the frequent updates that I’d
come to expect after working with other languages. The only substan-
tial update to JavaScript in a decade, ECMAScript 5, was a mere cleanup
that nevertheless took years for browsers to fully support. At the time, the
upcoming ECMAScript 6 (ES6) specification, codenamed Harmony, was far
from finished and seemed like a distant future. “Maybe in 10 years I’ll get to
write some ES6 code,” I thought.
There were some experimental “transpilers” like Google Traceur that
translated code from ES6 into ES5. Most of them were very limited or hard
to plug into an existing JavaScript build pipeline. But then a new transpiler
called 6to5 came along and changed everything. It was easy to install, inte-
grated well with the existing tools, and produced readable code. It spread
like wildfire. Now called Babel, 6to5 brought ES6 features to a mainstream
audience even before the specification was finalized. In a matter of months,
ES6 was everywhere.
ES6 has divided the community for a number of reasons. As this book
goes to press, it is still not fully implemented in many major browsers.
Having a build step can be intimidating when you’re just learning the
language. Some libraries have documentation and examples in ES6, and
you might wonder if it is possible to use those libraries in ES5 at all. This
contributes to the confusion. Many people didn’t expect any new features
in the language because it had almost never changed before. Others anx-
iously awaited the new features’ arrival and used all of them together—in
some cases beyond what was necessary.
Just as I was becoming proficient with JavaScript, I felt that somebody
pulled the rug from under my feet, and now I had to learn a new language.
I felt bad about this for a few months. Finally, on Christmas Eve, I started
reading a draft of this book. I couldn’t put it down. Next thing I knew, it
was 3 am, everybody at the party was asleep, and I understood ES6!
Nicholas is an incredibly gifted teacher. He conveys deep details in a
straightforward way so they don’t go over your head. Apart from this book,
he is also known for creating ESLint, a JavaScript code analyzer that has
been downloaded millions of times.
Nicholas knows JavaScript like very few people do. Don’t miss the
chance to soak up some of his knowledge. Read this book, and you, too,
will become confident in your understanding of ES6.

Dan Abramov
React core team member and creator of Redux

xviii   Foreword 
acknowledgments

Thanks to Jennifer Griffith-Delgado, Alison Law, and everyone at No Starch


Press for their support and help with this book. Their understanding and
patience as my productivity slowed to a crawl during my extended illness is
something I will never forget.
I’m grateful for the watchful eye of Juriy Zaytsev as technical editor and
to Dr. Axel Rauschmayer for his feedback and several conversations that
helped to clarify some of the concepts discussed in this book.
Thanks to everyone who submitted fixes to the version of this
book that is hosted on GitHub: 404, alexyans, Ahmad Ali, Raj Anand,
Arjunkumar, Pahlevi Fikri Auliya, Mohsen Azimi, Peter Bakondy, Sarbbottam
Bandyopadhyay, blacktail, Philip Borisov, Nick Bottomley, Ethan Brown,
Jeremy Caney, Jake Champion, David Chang, Carlo Costantini, Aaron Dandy,
Niels Dequeker, Aleksandar Djindjic, Joe Eames, Lewis Ellis, Ronen Elster,
Jamund Ferguson, Steven Foote, Ross Gerbasi, Shaun Hickson, Darren
Huskie, jakub-g, kavun, Navaneeth Kesavan, Dan Kielp, Roy Ling, Roman
Lo, Lonniebiz, Kevin Lozandier, Josh Lubaway, Mallory, Jakub Narębski,
Robin Pokorný, Kyle Pollock, Francesco Pongiluppi, Nikolas Poniros,
AbdulFattah Popoola, Ben Regenspan, Adam Richeimer, robertd, Marián
Rusnák, Paul Salaets, Shidhin, ShMcK, Kyle Simpson, Igor Skuhar, Yang
Su, Erik Sundahl, Dmitri Suvorov, Kevin Sweeney, Prayag Verma, Rick
Waldron, Kale Worsley, Juriy Zaytsev, and Eugene Zubarev.
Also, thanks to Casey Visco, who supported this book on Patreon.
Introduction

The JavaScript core language features are


defined in the ECMA-262 standard. The
language defined in this standard is called
ECMAScript. What you know as JavaScript
in browsers and in Node.js is actually a superset of
ECMAScript. Browsers and Node.js add more func-
tionality through additional objects and methods,
but the core of JavaScript remains as defined in ECMAScript. The ongoing
development of ECMA-262 is vital to the success of JavaScript as a whole, and
this book covers the changes brought about by the most recent major update
to the language: ECMAScript 6.

The Road to ECMAScript 6


In 2007, JavaScript was at a crossroads. The popularity of Ajax was usher-
ing in a new age of dynamic web applications, whereas JavaScript hadn’t
changed since the third edition of ECMA-262 was published in 1999.
TC-39, the committee responsible for driving the ECMAScript develop-
ment process, put together a large draft specification for ECMAScript 4.
ECMAScript 4 was massive in scope, introducing both small and large
changes to the language. Updated features included new syntax, modules,
classes, classical inheritance, private object members, optional type annota-
tions, and more.
The scope of the ECMAScript 4 changes caused a rift to form in TC-39:
some members felt that the fourth edition was trying to accomplish too
much. A group of leaders from Yahoo!, Google, and Microsoft created an
alternate proposal for the next version of ECMAScript that the group ini-
tially called ECMAScript 3.1. The “3.1” designation was intended to show
that this version was an incremental change to the existing standard.
ECMAScript 3.1 introduced very few syntax changes; instead, it
focused on property attributes, native JSON support, and adding meth-
ods to already existing objects. Although an early attempt was made to
reconcile ECMAScript 3.1 and ECMAScript 4, the effort ultimately failed
because the two camps had difficulty resolving the very different perspec-
tives on how the language should grow.
In 2008, Brendan Eich, the creator of JavaScript, announced that
TC-39 would focus its efforts on standardizing ECMAScript 3.1. It would
table the major syntax and feature changes of ECMAScript 4 until after
the next version of ECMAScript was standardized, and all members of the
committee would work to bring the best pieces of ECMAScript 3.1 and 4
together after that point into an effort initially nicknamed ECMAScript
Harmony.
ECMAScript 3.1 was eventually standardized as the fifth edition
of ECMA-262, also described as ECMAScript 5. The committee never
released an ECMAScript 4 standard to avoid confusion with the now-
defunct effort of the same name. Work then began on ECMAScript
Harmony, with ECMAScript 6 being the first standard released in this
new “harmonious” spirit.
ECMAScript 6 reached feature complete status in 2015 and was
formally dubbed “ECMAScript 2015.” (But this text still refers to it as
ECMAScript 6, the name most familiar to developers.) The features vary
widely from completely new objects and patterns to syntax changes and
new methods on existing objects. The exciting aspect of ECMAScript 6 is
that all of its changes are geared toward solving problems that developers
actually face.

About This Book


A good understanding of ECMAScript 6 features is critical for all JavaScript
developers going forward. The language features introduced in ECMA­
Script 6 represent the foundation upon which JavaScript applications will
be built for the foreseeable future. That’s where this book comes in. My
hope is that you’ll read this book to learn about ECMAScript 6 features so
you’ll be ready to start using them as soon as you need to.

xxii   Introduction 
Browser and Node.js Compatibility
Many JavaScript environments, such as web browsers and Node.js, are
actively working on implementing ECMAScript 6. This book doesn’t
attempt to address the inconsistencies between implementations; instead,
it focuses on what the specification defines as the correct behavior. As
such, it’s possible that your JavaScript environment may not conform to
the behavior described in this book.

Who This Book Is For


This book is intended as a guide for those who are already familiar with
JavaScript and ECMAScript 5. Although a deep understanding of the lan-
guage isn’t necessary to use this book, it will help you understand the dif-
ferences between ECMAScript 5 and 6. In particular, this book is aimed at
intermediate-to-advanced JavaScript developers programming for a browser
or Node.js environment who want to learn about the latest developments in
the language.
This book is not for beginners who have never written JavaScript. You’ll
need to have a good basic understanding of the language to use this book.

Overview
Each chapter and appendix in this book covers a different aspect of
ECMAScript 6. Many chapters start by discussing problems that ECMA­
Script 6 changes were made to solve to give you a broader context for those
changes. All chapters include code examples to help you learn new syntax
and concepts.

• Chapter 1: Block Bindings talks about let and const, the block-level
replacement for var.
• Chapter 2: Strings and Regular Expressions covers additional func-
tionality for string manipulation and inspection as well as the introduc-
tion of template strings.
• Chapter 3: Functions discusses the various changes to functions,
including the arrow function form, default parameters, rest param-
eters, and a few other features.
• Chapter 4: Expanded Object Functionality explains the changes to
how objects are created, modified, and used. Topics include changes to
object literal syntax and new reflection methods.
• Chapter 5: Destructuring for Easier Data Access introduces object and
array destructuring, which allow you to decompose objects and arrays
using a concise syntax.
• Chapter 6: Symbols and Symbol Properties introduces the concept of
symbols, a new way to define properties. Symbols are a new primitive
type that you can use to obscure (but not hide) object properties and
methods.

Introduction   xxiii
• Chapter 7: Sets and Maps details the new collection types of Set, WeakSet,
Map, and WeakMap. These types expand on the usefulness of arrays by add-
ing semantics, de-duping, and memory management designed specifi-
cally for JavaScript.
• Chapter 8: Iterators and Generators discusses the addition of iterators
and generators to the language. These features allow you to work with
collections of data in powerful ways that were not possible in previous
versions of JavaScript.
• Chapter 9: Introducing JavaScript Classes introduces the first formal
concept of classes in JavaScript. Often a point of confusion for those
coming from other languages, the addition of class syntax in JavaScript
makes the language more approachable to others and more concise for
enthusiasts.
• Chapter 10: Improved Array Capabilities details the changes to native
arrays and the useful new ways you can use them in JavaScript.
• Chapter 11: Promises and Asynchronous Programming introduces
promises as a new part of the language. Promises were a grassroots
effort that eventually took off and gained popularity due to extensive
library support. ECMAScript 6 formalizes promises and makes them
available by default.
• Chapter 12: Proxies and the Reflection API introduces the formalized
reflection API for JavaScript and the new proxy object that allows you to
intercept every operation performed on an object. Proxies give develop-
ers unprecedented control over objects and, as such, unlimited possi-
bilities for defining new interaction patterns.
• Chapter 13: Encapsulating Code with Modules details the official
module format for JavaScript. The intent is that these modules can
replace the numerous ad hoc module definition formats that have
appeared over the years.
• Appendix A: Minor Changes in ECMAScript 6 covers other changes
implemented in ECMAScript 6 that you’ll use less frequently or that
didn’t quite fit into the broader major topics covered in each chapter.
• Appendix B: Understanding ECMAScript 7 (2016) describes the three
additions to the standard that were implemented in ECMAScript 7,
which didn’t impact JavaScript nearly as much as ECMAScript 6.

Conventions Used
The following typographical conventions are used in this book:

• Italics are used for new terms and filenames.


• Constant width indicates a code term within the text.

xxiv   Introduction 
Additionally, longer code examples are contained in constant width
code blocks, such as the following:

function doSomething() {
// empty
}

Within a code block, comments to the right of a console.log() statement


indicate the output you’ll see in the browser or Node.js console when the
code is executed; for example:

console.log("Hi"); // "Hi"

If a line of code in a code block throws an error, it is also indicated to


the right of the code:

doSomething(); // throws an error

Help and Support


If you have questions as you read this book, please send a message to my
mailing list at http://groups.google.com/group/zakasbooks.

Introduction   xxv
1
Block Bindings

Traditionally, the way variable declara-


tions work has been one tricky part of pro-
gramming in JavaScript. In most C-based
languages, variables (more formally known as
bindings, as a name is bound to a value inside a scope)
are created at the spot where the declaration occurs.
In JavaScript, however, this is not the case. Where
your variables are actually created depends on how you declare them,
and ECMAScript 6 offers options to make controlling scope easier. This
chapter demonstrates why classic var declarations can be confusing, intro-
duces block-level bindings in ECMAScript 6, and then offers some best
practices for using them.
Another Random Scribd Document
with Unrelated Content
Käräjät onnistuivat erinomaisesti. Minä, jolla tällä alalla oli jo
entuudestaan mitä monipuolisin kokemus Ristiniemen ajoilta, hoidin
tehtäväni loistavasti. Syytin ponnella ja peräänantamattomuudella,
mutta — milloin vain ilmeni hiukankin lieventäviä asianhaaroja, —
olin ensimmäinen alleviivaamaan niitä. Ja niitähän ilmeni joka
jutussa. Saavutin heti ensi esiintymiselläni sekä istuvan tuomarin
että lautakunnan yksimielisen tunnustuksen.

En mahtanut mitään sille, että parikymmentä henkilöä pääsi


viettämään joulua lukkojen taakse. Mutta — jos he vain olivat
puoleksikaan panneet merkille, millä inhimillisyydellä minä olin
syyttäjänä esiintynyt, he varmaan söivät joulupuuronsa yhtä
tyytyväisinä kuin minäkin.

Minulla olisi paljon kertomista tältä ensimmäiseltä vuodelta


nimismiehenä ja toimeenpanevan vallan edustajana. Mutta kun
mieleni ja harrastukseni ovat aina pyrkineet suuntautumaan
runouden purppuraista taivasta kohti, sivuutan virka-asiat ja kerron
vain sellaista, mikä tavalla tai toisella on yhteydessä näiden
harrastusten kanssa.

Jo ensimmäisenä vuonna tutustuin melkein kaikkiin Kuivalassa


asuviin taiteilijoihin. Niitä oli suuri joukko. He olivat hyljänneet
pääkaupungin humun ja vetäytyneet maalle taidetta palvelemaan.
Vanhoja veteraaneja kuluneissa puvuissa, sellaisia kuin esim.
Runoilija Jouko Touko ja Rietin-Kaapo. He olivat näppäilleet
lyyraansa Suomenmaassa jo kolmisenkymmentä vuotta, mutta en
huomannut heitä missään suhteessa itseäni, etevämmiksi. Kaipa
juuri tästä syystä he heti ensi tutustumiselta liittyivät seuraani, sillä
runoilijoilla on herkät vaistot: he haistavat Horatiuksen jo pitkän
matkan päästä. Ja vaikka minusta kohtalon pakosta ei ole tullut
Horatiusta paremmin kuin Virgiliustakaan, olen heidän seurassaan
istuessani tuntenut edustavani näitä klassillisia ukkeleita. Sillä — kun
olen toisinaan lukenut heille esim. »Henkivakuutusasiamiehen» tai
»Sankarisielun» — ovat he käyneet sanattomiksi hämmästyksestä.
Mutta minä, jonka pääkoppa on monessa liemessä keitetty, olen
ystävällisesti taputellut heitä olkapäälle ja sanonut: »Ei yhtään
hätää, veljet! Runoilkaa te vain rauhassa! Se kun minä vain näin illan
kuluksi näytän, minkälaista tauhkaa minun pöytälaatikkoni sisältää.»
Johon Touko on useamman kuin yhden kerran huomauttanut:
»Mutta, saakuri! Siellähän on ruokaa Suomen kansalle ja sinä säilytät
sitä pöytälaatikossasi naulojen ja patruunanhylsyjen parissa. Se on
huono skafferi niin delikaattisapuskoille, piru vieköön!»

Reitin-Kaapo on ainoa, joka tavallisesti on ruvennut panemaan


vastalauseita, kun käteni ratkaisevana hetkenä on sukeltanut
pöytälaatikkoon. »Pois käsi sieltä!» hän on huuaissut minulle kuin
vanha tantti lapselle, joka pyrkii sokuripaloja varastamaan. »Minä en
halua yhtään runoa. Tämä kuminaviina on paljon parempaa.
Nauttikaamme siitä!»

Mutta minä en tavallisesti ole antanut perään, vaan olen


itsepintaisen lapsen lailla varastanut sokuripalasen. Silloin on Rietin-
Kaapo päätänsä heilutellen kuin pökkäämään valmistautuva pässi
ruvennut hokemaan: »Liirum laarum, tiirum taarum», johon Jouko
Toukokin toverinsa esimerkin rohkaisemana on yhtynyt: »Litsis lätsis,
ritsis rätsis». Mutta minä en ole välittänyt heidän liirumlaarumeistaan
enkä litsislätsis-läpsytyksistään, vaan olen lausunut mahtavan »Perä-
Pohjolani» yhä kasvavalla paatoksella, kunnes — päästessäni
viimeisen värssyn viime säkeisiin: »Tämä maa minun mieltäni
miellyttää, tämä Suomen manteren miehuuspää!» — olen
huomannut runoilijaveljien »miehuuspäiden» pamahtaneen rintaa
vasten ja syvän kuorsauksen tärisyttävän pientä huonettani. Niin
valtavan vaikutuksen on »Perä-Pohjola» tehnyt. Se on nukuttanut
nämä Suomen leijonat, joilla muuten on sangen terävät kynnet
tassuissaan, jos sille päälle sattuvat. Sellaisina hetkinä olen hiljaa
kohonnut pystyyn, hiipinyt Jouko Touon tuolin taa ja, laskien käteni
hänen päälaelleen, lausunut murheellisella äänellä:

»Oi Suomen runous kuink' oot sa raukea! Oi taiteen tantere


kuink' oot sa aukea: vain siellä täällä torkkuu pari päätä ja
kansan sydän täynnä routaa, jäätä. Oi, Herra, herätä!»

Silloin on Jouko Touko äkkiä nostanut pörröisen päänsä pystyyn ja


päästänyt pitkän »kukko kiekuu»-huudon, johon Rietin-Kaapo on
tavallisesti yhtynyt kot-kot-kot-kaakatuksellaan. Se on ollut heidän
mielestään vitsiä, mutta minusta on näissä veljieni »lauluissa» joka
kerta kajahtanut ilmoille Suomen kuolevan runouden viimeinen
hätähuuto ja minä olen painanut kädet kasvoilleni ja itkenyt.

Niin — voinpa siis kerskata tuntevani Suomen suurimmat runoilijat


ja kirjailijat, maalareista ja kuvanveistäjistä puhumattakaan. Yksi
viimeksimainituista, Paavo Kottu, on hakannut pääni marmoriin. Se
kaunistaa kirjahyllyni päällystää. Mutta minun ei pitänyt kertoa siitä.
Minun piti puhua taiteilijaveljistäni. Kirjailijoista olen eniten
seurustellut novellisti Kalle Nousun kanssa, joka on sangen hiljainen
herra. Istuu puolipäivää puhumatta sanaakaan, mutta on sitä
kiitollisempi kuulija, koska hänellä ei Jouko Touon ja Rietin-Kaapon
lailla ole taipumusta vastalauseisiin. Taikka — hän on vastalausetta
koko mies — omaa kirjallista suuntaansa vastaan. Sillä on melkein
mahdotonta uskoa, että tämä ujo mies on voinut kirjoittaa sellaisen
väkevän kirjan kuin »Kuu, kuhilas ja kirjava vasikka». Se on
suomalainen Dekameron ja minä olen lukenut sen ainakin
kahteenkymmeneen kertaan, vieläpä lainannut sen kirkkoherra
Teofilus Tiennäyttäjällekin, vaikka en yleensä harrastakaan kirjojen
lainaamista.

Kirjailija Kalle Nousun kanssa olemme mitä parhaita ystäviä. Hän


on m.m. lukenut »Runoryijyni» ja antanut siitä hyvän arvostelun.
Hän on sanonut: »Jos minulla olisi ollut kaikki nuo aiheet, olisin
aikoja elänyt koroillani.» Minä uskon sen. Mutta nyt kun ne on
minulla, en ole saanut edes teostani julkisuuteen. Sellaista on elämä.

Yleensä olen elänyt sovussa runoilijaveljieni kanssa. Ainoastaan


kirjailija Saarles Suokuovin kanssa ovat välit pyrkineet rikkoutumaan.
Mainittu herrasmies on tavattoman lahjakas, mutta niin oikullinen,
että toisinaan suuttuu puolesta sanastakin ja kirjoittaa kymmenen
arkin pituisia haukkumakirjeitä. Minä olen kuitenkin siksi
jalomielinen, etten tuosta loukkaannu. Pistän kirjeen arkistooni
ajatellen, että tulevatpahan kerran tarvituiksi, — jolleivät ennemmin,
niin ainakin tämän merkillisen kirjailijan kuoleman jälkeen, jolloin
hänen runoilijakuvansa Suomen kansalle esitetään.

Tätä kirjailijaa kohtaan tunnen kaikesta välillämme sattuneesta


kahnauksesta huolimatta mitä suurinta mielenkiintoa, sillä olen
huomannut hänet henkiseksi sukulaisekseni: häntä samoinkuin
minuakaan ei oma aika ole ymmärtänyt, vaan molemmat olemme
saaneet mitä suurimmassa määrin väärinkäsitystä ja kateutta
osaksemme.

Mutta — mitäpäs siitä. Luulen, että ystäväni Saarles Suokuovi


yhtyy seuraaviin säkeisiin, jotka löytyvät runossani »Runoilijan
palkka»:
Kun alkuaineet avaruuden kuumuuttansa hohtaa ja
raukeaapi mailma tulikaaokseen, kun leimauksessa salaman,
— haa! — länsi idän kohtaa ja taivas kiertyy kuni kirja
rullalleen, kas silloin saavat runoilijat väärin ymmärretyt. ah,
lopullisen runoilijaeläkkeen: he ylimmäisnä istuvat, nuo silloin
lepytetyt, käy enkellaumat etehensä polvilleen.»
XIII.

MINÄ RUPEAN FILMINÄYTTELIJÄKSI JA LASKEN HÄRJÄNKURKUN


YHDELLÄ TUKILLA.

»Se ihme, joka viimeks tuli ilmi ja keksinnöiden pitkän


mitan täytti, mi vanhan suunnan näyttelijöille näytti, ah,
pitkän nenän! — Se oli filmi.»

Näin alkaa runoni »Viimeinen ihme», jonka kirjoitin kohisevan


koskilla muutamana heinäkuun iltana koskenlaskunäytösten jälkeen.

Minusta oli tullut filminäyttelijä.

Filmiosakeyhtiö »Ihanne» oli päättänyt filmata Ville Korpelan


»Koskenlaskijan kosinnan». Koska koskenlaskukohtaukset
muodostavat teoksen nousupaikat, oli selvää, että
näyttelijäseurueen, jonka filmiyhtiö oli palkannut mainittua filmiä
näyttelemään, täytyi esittää myös koskenlaskut — luonnossa. Mutta
mistä saada mies, joka ryhtyisi yritystä johtamaan?

Yksikään seurueen jäsenistä ei pystynyt siihen — luonnollisesti.


Eiväthän nuo Helsingin herrat ja röökinät olleet oikeaa koskea edes
nähneetkään — saatikka sitten laskeneet.
Minä olin tuttavapiirissäni kertonut Perä-Pohjolan koskenlaskuista.
Olin kuvannut heille yhdellä tukilla laskun Pahtakosken kohisevien ha
päiden välistä. Minä olin tuon tempun suorittanut kymmeniä kertoja.

»Mutta laskeppas Härjänkurkusta, sitten vasta olet mies!» tikaisi


ystäväni Jouko Touko.

Tiedustelin, missäpäin Suomea sellainen koski oli. Sain kuulla sen


olevan yhden Kohisevan vuolaimpia koskia Kymenlaakson puolessa.

»Vaikka kadotuksen portista, jos niikseen tulee!» huudahdin minä


ja löin nyrkkiä pöytään.

»Hyvä… pannaanpas korvan taa», myhäili Jouko Touko


salaperäisenä ja vilkutti silmää.

Hänellä oli silloin jo asia tiedossaan, vaikkei tuo pahus minulle


mitään puhunut.

Parin päivän kuluttua sain kirjeen, jossa minua kehoitettiin


tulemaan kaupunkiin ja ilmoittautumaan »Ihanteen» johtajalle, herra
Martti Murulle.

Olin tämän herran jo aikaisemmin tavannut. Tiesin, että hän oli


entinen muurari, joka nyt oli kohonnut Suomen suurimman
filmiyhtiön johtajaksi.

Hän esitti minulle asian. Runoilija Jouko Touko oli hänelle kertonut.

Arvasinhan minä.

Asiasta sovittiin ja kahden viikon kuluttua meidän piti tavata


Kohisevalla.
Siellä oli suuri joukko herroja ja naisia koolla. He kuuluivat
näyttelijöihin. Herra Muru esitteli minut heille:

»Tässä on herra Kuuskoski, joka aikoo laskea Härjänkurkun.»

»Kyllä… se on vakava tarkoitukseni, hyvä herrasväki», ilmoitin


minä, tehden maailmanmiehen kumarruksen.

Johtaja Muru oli jo teettänyt lautat valmiiksi. Niillä piti minun nyt
Helsingin herrojen kanssa hursalluttaa alas Kohisevan kuohuista.

Läksin tarkastelemaan lauttoja ja hämmästyin. Kaikkea pitää


nähdä, kunhan kyllin vanhaksi elää! Vai tällaisilla risukimpuilla aikoi
johtaja Muru lähettää meidät koskille!

Kieltäysin jyrkästi ja panin lähtöni ehdoksi, että saan itse rakentaa


lautat. Muuten en uhannut puuttua koko yritykseen.

»Mutta — ne on vanha ja kokenut koskenlaskija valmistanut»,


huomautti herra Muru. »Kyllä hän ymmärtää asian.»

Vastasin, ettei mainittu herra ymmärtänyt kerrassaan mitään,


olkoonpa sitten vaikka kymmenesti koskenlaskija ammatiltaan. Ei
muuta kuin uudet lautat, jos mieli minun olla yrityksessä mukana.

Monien tuumailujen jälkeen suostui johtaja viimein. Minä rupesin


kaatamaan puita yhtiön laskuun. Näytin herroille alusta pitäen, miten
lautta oli rakennettava, — näytin yksityiskohtia myöten. He
levittelivät käsiään ja ihmettelivät.

»Ei meillä ole ollut aavistustakaan lautan kokoonpanosta,


ennenkuin nyt vasta», huudahti rouva Korvanen, seurueen etevin
naisnäyttelijä. »Tuohonhan uskaltaa ottaa ompelukoneensakin
mukaan.»

Neuvoin rouvaa kuitenkin jättämään sen kotiin. Huomautin, ettei


meillä nyt ollut aikaa neulomiseen.

Pidinkö todellakin koskia niin vaarallisina?

Joo — vaikka eivät ne sentään Perä-Pohjolan koskille vertoja


vetäneet yksikään. Mutta sittenkin oli paras olla varovainen.

Lauttojen lyömiseen meni kokonainen viikko. Sillä välin tappoi


herrasväki aikaa, miten parhaiten taisi. Joukossamme oli pianisti,
joka illoin töiden päätyttyä rimputteli klaveeria ja me pistimme
tanssiksi kortteeritalon avarassa salissa.

Minusta oli vähitellen tullut seurueen keskipiste. Taiteilijan herkällä


vaistolla nuo helsinkiläiset hempukat tajusivat, mikä minä olin
miehiäni. Tein uudelleen saman kokemuksen kuin niin monessa
paikkaa ennenkin, etteivät naiset voineet minua vastustaa. He
suorastaan hurmaantuivat minuun.

»Te olette runoilija, herra Kuuskoski», lausui minulle eräänä


päivänä rouva Korvanen, kun olin hänelle kertonut koskenlaskuista
Pohjolassa. »Te saatte kuvauksissanne ihan vaahdon pärskymään!
Hui, minusta tuntuu, kuin olisin jo yltä päältä märkä!»

Ja tuo pikkuinen rouva katseli vaaleaa kesäpukuaan nauraen kuin


koulutyttö.

»Tiedättekö, herra Kuuskoski, minusta te olette syntynyt


näyttelijäksi. Te osaatte jokaisen liikkeen, jokaisen ilmeen. Teille
kuuluisi Romeon osa.»
»Kyllä minä rupean Romeoksi, jos te vain suostutte Juliaksi»,
vastasin minä ja heitin hänelle lentosuukkosen.

»Ai, ai… mitähän minun mieheni sanoisi?» Rouva Korvanen nauraa


kikatti katketakseen.

Johtaja Muru tuli tarkastamaan työtäni. Hän rupesi minua


neuvomaan.

»Minä olen lyönyt lauttoja, ennenkuin te olette syntynytkään. Jos


ei kelpaa, niin saatan muuttaa kauppani Rahtulan päähän.»

Hän ei vastannut mitään, vaan meni närkästyneenä matkoihinsa.


Minua nauratti. Tiesin, ettei yrityksestä ilman minua tullut mitään.

Lautat olivat valmiit. Seuraava päivä oli määrätty laskupäiväksi.


Edellisenä iltana minä annoin näyttelijä Korvaselle opetusta etumelan
hoidossa. Ei saanut missään tapauksessa antaa melan hypätä
haaroista pois. Siinä oli ensi kertalaiselle kova paikka. Olimme
sitäpaitsi käyneet tarkastamassa koskia, joten tiesimme väylät.
Reippaana miehenä hän vakuutti tulevansa toimeen, sillä olihan
minun tehtävänäni hoidella perämelaa.

Samalla tavoin opetin toisenkin lautan miehet. Hekin lupasivat


parastaan.

Huomispäivä vaikeni. Kosken rannoille oli kerääntynyt suunnaton


väen paljous katselemaan laskuamme. Monet varoittivat meitä
lähtemästä. Rouva Korvanenkin oli aivan suunniltaan. Hän pelkäsi
miehensä hukkuvan.

»No… jos hän hukkuu, niin kyllä minä nain sitten teidät», ilvehdin
minä.
»Hyi teitä, kuinka olette jumalaton!»

Rouva Korvasen kyynelisissä silmissä väikehti veitikka.

Kun olimme paikoillamme, komensin löysäämään sinkkiköydet irti.


Käskyä toteltiin ja tuossa tuokiossa ryösti väkevä virta meidät
mukaansa. Toinen lautta irrotettiin heti jälkeen ja yks' kaks'
huristimme hyvää vauhtia ensimmäisiä kuohuja kohti.

Hei, kuinka rintani aaltoili! Tunsin olevani omassa elementissäni.


Kosken pauhu ja vaahtopääharjat ympäröivät minut joka puolelta.
Nyt sain taas näyttää, mihin pystyin. Minä leikkautin lauttani
ensimmäisen putouksen suuta kohti ja kajahutin laulun:

»Hei, poiat, tukkilaiset, nyt joukoin puoetetaan nuo kurkut


kuohuvaiset lautalla oistonaanl Niin on, kuin Hiiden kyyti tää
lasku loistokas! 'Hei, roiskis, aalto! Syyti! Vai kastat,
peijakas!'»

Aivan kuin edeltäpäin tietäen, että tässä kohdassa piti perämiehen


saada ryöppy niskaansa, löi mahtava laine minua vasten naamaa,
niin että sain hyvän aikaa töpehtiä, ennenkuin pystyin jatkamaan:

»Hei, poiat tukkilaiset, kas, kuinka koski soi! Ja kuolon


keijukaiset tuoll' alhaall' ailakoi: Senvuoksi röhki lyönti
vasempaan, oikeaan! On muuten Surman syönti ja kulku
kuolemaan!»

Hei vaan! Täällä ärjyvien vaahtopäiden keskellä kukki taas


»Runoryijyni», sillä tuo palanen kuului tukkilaislauluihini. Tällaisessa
ympäristössä ne olisi arvosteltava eikä konttoripulpetin ääressä.
Täällä, missä kuolema vaani vesikiven takana, oli oikea paikka niiden
voiman ja väkevyyden punnitsemiseen. Mutta mistäs kustantajat
tiesivät, millaista oli koskenlasku. Näyttelijä Korvanen sen näytti
tietävän, koska seisoi valjuna etumelassa ja puri kalpeita huuliaan
yhteen.

»Hyvin menee!» huusin hänelle läpi kuohujen. »Pitäkää vain tuota


kalliota kohti. Sen vasemmalta puolelta hursallamme alas
putoukseen.»

Virta oli väkevä. Silmäsin rannalle kokoontunutta väkijoukkoa. Se


oli lähtenyt juoksemaan Härjänkuilulle nähdäkseen, miten
suoriutuisimme siitä. Se oli minustakin pahin paikka matkallamme.
Nämä alkuputoukset olivat leikkiä sen rinnalla. Mutta minä olin
edellisenä päivänä tutkinut sen asiantuntijan silmin ja tiesin, kuinka
se leikattaisiin.

Lautta lotisi ja lotkahteli. Tukkien välistä hyrskysi kokonaisia


vesipatsaita ilmaan. Oli, kuin olisi kosken haltia vimmoissaan
sylkenyt pohjasta käsin ja siten osoittanut halveksumistaan meidän
varustuksillemme.

Mutta minä tiesin, että lautat kyllä kestäisivät. Ainoa, mikä


saattaisi yllättää, oli joku terävä pohjakallio. Sellaisen kynsissä ei
kestäisi lujinkaan lautta. Siitä olivatkin Kohisevan laskumiehet
puhuneet. Mutta vielä en ainakaan ollut sellaista havainnut.

Ylikorva ja Keskikorva oli onnellisesti laskettu. Me olimme jokainen


märkiä kuin kuikat. Etumelan hoitaja, näyttelijä Korvanen katsahti
silloin tällöin taaksensa; miesparkaa näytti pahasti pelottavan. Tämä
oli toista kuin tehdä rakkauden tunnustuksia teatterilavalla.

»Katse eteenpäin!» komensin minä. »Ne filmaavat rannalla.»


Jo rupesi kuulumaan Härjänkurkun kumea kohina. Lautta lotisi ja
ruskahteli pahasti. Huonosti olisi käynyt, jos herra Murun lautoilla
läksimme tuosta kadotuksen kuilusta alas.

»Hei, voimakas lyönti vasemmalle!» hihkaisin minä niin paljon kuin


jaksoin, vaikka aallot löivät ylitseni, niin että minun oli vaikea pysyä
paikoillani.

Korvanen iski melallaan kuin hullu. Mies taisteli kuin kuoleman


hädässä. Nyt… nyt…! Oikealta kohosi vesi loivasti rantakallioita kohti.
Se johtui kosken paineesta. Meidän piti päästä mahdollisimman
lähelle tuota loivasti kohoavaa vesimassaa, sivuuttaaksemme sen
avulla kosken yläpäässä kohoavan kallion ja paiskautuaksemme
sitten täydellä painolla kurimukseen. Se onnistuikin ja tasaisesti
kiihtyvällä vauhdilla me rupesimme painumaan Härjänkurkkua kohti.

Huomioon ottaen kosken jyrkkyyden olin rakentanut lautat


lyhyenpuoleisiksi. Siten ei sukeltamisen vaara ollut niin suuri. Mutta
sittenkin rupesi nyt arveluttamaan, kun tarkastelin veden juoksua
kosken niskalta käsin. Se näytti koko lailla toisenlaiselta kuin rannalta
katsottuna.

Heti kosken alapuolella rantakalliolla seisoi filmaaja valmiina


veivaamaan konettansa, kunhan ehtisimme »mäkeen». Hiuuuu! Nyt
alkoi Härjänkurkku vetää. Vauhti kiihtyi kiihtymistään. Vaahto lensi
ilmassa kuin savu, piiskaten kasvoja kuin räntäsade. Kävi sellainen
jylinä ja pauhu, ettei omaa ääntänsä tahtonut kuulla.

Mutta minua tämä vain virkisti. Käsivarteni lihakset jännittyivät ja


minä seisoin suorana perämela korokkeella kuin kapteeni
komentosillalla. Koski ulvoi ja raivosi kuin ärsytetty peto. Oli kuin olisi
se ollut vimmoissaan, että löytyi yksi mies, joka aikoi sen kuohut
voittaa.

»Töppöset lujasti tantereeseen!» huusin näyttelijöille, kun tultiin


ensimmäiseen kuohuun. Suuri aalto pyyhkäisi yli lautan ja löi
saappaanvarret vettä täyteen. Tuli toinen ja kolmas. Pärske seurasi
pärskettä ja ylhäältä satoi niskaan kuin vihmomalla. Nyt kohosi
edessämme suuri, mahtava aalto. Se ulottui poikki kosken aivan kuin
joku mahdottoman korkea valli. Lautta kiiti sitä kohti kuin vimmattu.
Hurrll…! Olimme hetken näkymättömissä ja korvissamme soi ja
kohisi, kunnes äkkiä taas sukelsimme näkyviin, vaatteet vettä valuen.
Etumelan hoitaja oli menettänyt hattunsa. Se ei kuulunut ohjelmaan,
mutta se paransi vain asiaa. Tulihan kuvasta siten elävämpi. Vielä
hursallus, voimakas lyönti oikeaan ja me soljuimme suvantoon, josta
kauniissa kaaressa ohjasimme rantaan. Matka oli tehty.

Toinen lautta tuli onnellisesti perässä. Se oli vain kerran kolahtanut


pahanlaisesti vesikiveen, mutta lujaksi lyötynä se kesti iskun ja solui
onnellisesti viereemme rannalle.

Väkijoukko oli haltioissaan, se huusi ja hurrasi, heilutti hattuja ja


nenäliinoja. Maalle noustuani kohtasin ensimmäiseksi rouva
Korvasen. Hän oli aivan hurmioissaan. Kiepahtaen kaulaani hän
huusi silmät loistaen:

»Te olette suurenmoinen mies, Adam Kuuskoski. Te olette


nykyajan
Napoleon. Tuo teidän laskunne oli kuin joku Austerlitz.»

Ja hän, tuo veikeä olento suuteli minua molemmille poskille ja


juoksi sitten syleilemään miestänsä, joka parast'aikaa kömpi
rannalle.
Minä olin tietysti hetken sankari. Itse johtaja Murukin irtautui
hetkeksi jäykkyydestään ja tuli onnittelemaan.

»Se oli fiinisti tehty, herra Kuuskoski! En ole ennen sellaista nähnyt
Pakkasi ihan peloittamaan.»

Työ oli siis onnellisesti suoritettu. Emme filmanneet enempää sinä


päivänä. Onnellisen laskun kunniaksi söimme kortteeritalossa juhla-
illalliset ja joimme maljan Kohisevan kuohujen kunniaksi.

Sunnuntaiksi olin sitten ilmoittanut bravuuriosani suorituksen:


yhdellä tukilla laskun.

Tämä uutinen oli lentänyt kulovalkean tavoin pitkin koko


jokilaaksoa. Kaikki halusivat nähdä miestä, joka aikoi uhmata
Härjänkurkkua yhdellä tukilla. Sellaista ei ole näillä tienoin ennen
nähty, ei kuultu. Vanhat miehet neuvoivat minua luopumaan
yrityksestä, jota he pitivät sulana hulluutena. Mutta minä muistin
Jouko Touon sanat: »Sitten vasta olet mies, jos lasket Härjänkurkun
yhdellä tukilla.»

Vahinko vain, ettei tuo runoilijaveljeni ollut katsomassa. Tasan


kello 1/2 11 aamupäivällä hyppäsin tukin selkään ja rupesin
solumaan keskijoen juoksua kohti. Rannat olivat mustana
pyhäpukuista kansaa ja minulla vilahti mielessä, että tänä pyhänä
taisi pappi saada saarnata tyhjille seinille kolmessa pitäjässä.
Tukahutin kuitenkin tuon ylimielisen ajatuksen ja tein hengessäni
ristinmerkin, sillä — totta puhuakseni — Härjänkurkku ei ole niitä
paikkoja, joita käy yhdellä tukilla laskeminen. Minä olin kuitenkin
antautunut leikkiin ja leikki oli leikittävä loppuun asti.
Kuohut pärskähtelivät kupeellani ja minä sain tavan takaa
hypähdellä ilmaan, kun tukki töksähteli kiviin. Alutta lyöden vettä
vimmatusti keksillä molemmin puolin tukkia minä soluttelin sen taas
oikeaan suuntaan ja vauhti lisääntyi.

Alkutaivalta en peljännyt. Sehän oli — kuten edellisestä on ehkä


selvinnyt — tasaisenpuoleista koskista taivalta, niin että siinä
tavallinen mies sentään tukilla pysyy. Pelkäsin Härjänkurkun
alkulaskua, ennen kaikkea kalliota sen niskalla.

Hyvin sujui matka. Olin jo ehtinyt puoliväliin, kun äkkäsin


muutaman kiven, jota lautalla laskiessamme en ollut havainnut. Se
oli puolittain veden alla, mutta niin sopimattomalla paikalla, että
virran pääpaino hyökkäsi sitä vastaan koko voimallaan. En ymmärrä,
miten olin sen edellisellä kerralla sivuuttanut. Vai oliko se joku
irtonaisista pohjakivistä, jonka lauttamme oli riipaissut liikkeelle ja
pysähdyttänyt tuohon juuri kuin kiusaksi minulle.

Näin selvään, että tukkini kulki sitä kohti yhä kasvavalla vauhdilla…
Koetin lyödä sitä oikeaan mutta virta painoi sitä itsepintaisesti kiveä
kohti. Yhteentörmäys oli välttämätön.

Yks' kaks' se tärähti. Koko tukki vapisi kuin vilutautinen, mutta


samassa olin minäkin ilmassa ja hihkaisin hurjasti. Se pahus rupesi
vielä vimmatusti pyörimään, joten minä sain tavallista kiperämmässä
tahdissa antaa tanssinäytännon rannalla seisoville katsojille.
Vähitellen se kuitenkin rauhoittui ja minulle tuli kiire pitää silmällä,
kummalleko puolelle sen peräpuoli kaartaisi, ollakseni valmis
suhtautumaan siihen sen mukaan.

Se kaarsi kaikeksi onneksi oikealle. Minulta pääsi helpotuksen


huokaus, jos se olisi kaartanut vasemmalle, olisin joutunut pahimpiin
kuohuihin, joiden keskellä silloin tällöin tuli näkyviin mustankiiltäviä
kallionhuippuja. Se olisi ollut minun viimeinen matkani.

Nyt — kuten sanottu — kaarsi tukki oikealle. Minä pääsin sillä


tavoin kiinni sillä puolen juoksevasta pääväylästä ja sain tukkini taas
matkaan.

Nyt en enää peljännyt kiveä. Olin varma, että »lientä» riitti.


Putouksen jyrkkyys pakkasi vain hermostuttamaan.

Mutta lasku kävi paremmin kuin oli osannut toivoakaan. Ennenkuin


oikein osasin tajutakaan, olin jo kosken alla ja Härjänkurkku pauhasi
takanani. Vain kerran vajosin vyötäröitä myöten, silloinkuin tukki
suuren aallon puhkaistuaan hursalsi kosken alle. Luisuin suvantoon
kuin vedenalaisella hevosella ratsastaen ja hämmensin rannalle hien
virtoina valuessa.

Jos ensi kerralla olivat suosionosoitukset olleet valtavat, niin nyt ne


vasta huippuunsa kohosivat. Tuskin olin päässyt kuivalle ja heittänyt
keksin maalle, kun kymmenet käsivarret tarttuivat minuun ja
rupesivat heittämään ilmaan, huutaen: »Eläköön Suomen
ensimmäinen tukkipoika! Eläköön Aadam Kuuskoski!» Sen jälkeen
minut kukitettiin.

Tuskin on Hannes Kolehmainen olympialaisvoiton jälkeen tuntenut


itseään niin onnelliseksi kuin minä tuona suurenmoisena hetkenä.

Juhlasaatossa kannettiin minut majapaikkaamme. Haltioitunut


väkijoukko seurasi mukana, huutaen ja hoilaten. Minun piti pari
kertaa — ennenkuin pääsin vaatteita muuttamaan — käydä portailla
näyttämässä itseäni ja kumartamassa. Se oli näytäntö se! Mitä ovat
kuihtuvat laakerit sen haltioituneen jumaloinnin rinnalla, jota
Kohisevan kansa minulle silloin osoitti. Sinä päivänä oli kansa
koskensa arvoinen: sekin kohisi ja kiehui ympärilläni kuin kosken
vaahto.

Mutta ennen kaikkea olivat toverini iloisia. He tahtoivat ihan syödä


minut, seurueen naisjäsenet olletikin. Jokainen heistä tarjoutui
auttamaan minua. Yksi veti saappaat jaloistani, toinen väänsi
sukkiani, kolmas koppoi vettä valuvat housuni ja juoksutti ne aidan
seipääseen kuivamaan. Minä tepastelin seurueen keskellä paljain
säärin ja tiedustin nauraen, sallisivatko uskon sisaret minun kiskaista
paidankin pois, sillä minun päälläni ei ollut kuivaa lankaa. Mutta
silloin he rupesivat protesteeraamaan ja pakenivat kirkuen ja
nauraen huoneesta ulos.

Koskenlaskut oli siis filmattu. Me vietimme iltaa juhlallisesti.


Taisimmepa maistaa hiukan »miestä väkevämpääkin». Itse rouva
Korvanen ojensi minulle lasin ja virkkoi:

»Te ette nyt ole nimismies, te olette runoilija ja tämä malja pitää
teidän nyt tyhjentää.»

Mikäpäs siinä auttoi. Minä kilistin läsnäolijoiden kanssa ja esitin


lähempää tuttavuutta, johon he kaikki ilomielin suostuivat.

Se oli herttainen ilta, taiteen ja runouden merkeissä vietetty.


Sanoin »runouden», sillä siitä puolesta pidin minä erikoisen huolen.
Lausuin nimittäin »Runoryijyäni» illan kuluksi ja kerroin lyhyesti,
minkä kohtalon se oli kustantajien puolelta saanut. Näyttelijä
Korvanen uhkasi ensi näkemässä tappaa kustannusosakeyhtiö
»Korukannen» johtajan, sillä hänen mielestään minulle oli tehty
sellainen vääryys, että se huusi kostoa hamaan taivaaseen asti.
Niin vaikuttaa tosi runous, kun se kohtaa vastaanottavan ja herkän
sydämen.

Mutta — se olikin viimeinen ilta, jolloin »Koskenlaskijan kosinta»


kokosi meidät sovinnossa ympärilleen. Myöhemmin alkoi riita,
niinkuin aina suurten tapausten jälkeen.

Minä kirjoitin »Kuivalan Sanomiin» kuvauksia


filmausmatkaltamme. Kerroin totuuden mukaan, niinkuin asiat olivat
tapahtuneet. Tosin vedin kuvausteni ylle hienon huumorin vernissan.
Mutta siitäkös myrsky nousi.

Minulta tahdottiin riistää kaikki kunnia yrityksen onnistumisesta.


Toverini, joista veljenkättä lyöden olin eronnut, saivat vielä
paikkakuntalaisetkin puolelleen. Minä olin muka välttänyt
vaarallisempia paikkoja.(!) Toipa eräs kirjoittaja esiin sellaisenkin
hämmästyttävän väitteen, että pianisti Kaiho olisi yhtä hyvin pystynyt
ohjaamaan lauttaa kuin minäkin.(!) Herra Jumala! Olisin totisesti
halunnut nähdä tuon humalasalon seisovan perämelassa! Takaan,
että tämän matkan jälkeen olisivat pianiinot hänen osaltaan saaneet
jäädä rauhaan — ikuisiksi ajoiksi. Sillä kalojen ruokaa hänestä olisi
tullut — se on varma.

En halua ruveta kertomaan kaikkea, mitä tuosta asiasta


kirjoitettiin. Harvoin on painomustetta niin paljon turhaan haaskattu,
kuin mitä vastustajien! artikkeleihin on kulunut. Minä vastasin
lyhyesti ja arvokkaasti, ehkä hiukan »voiman oikealta puolelta»,
koskapa viimeisen vastineeni jälkeen tuli syvä hiljaisuus kuin merellä
myrskyn jälkeen. Kai vastustajani lopultakin häpesivät, koska olen
sen jälkeen saanut rauhassa elää.
Mutta tuo polemiikki ei yhtään vahingoittanut minua. Päinvastoin.
Tieto uljaasta koskenlaskustani oli ehtinyt kiertää kaikki valtakunnan
lehdet ja moni niistä ryhtyi minua puolustamaan, nähdessään,
kuinka minut aiottiin »tappaa». Minusta tuli yhtäkkiä kuuluisa mies.

Olin jälleen runoillut itseni läpi!

Mitä minun sanomalehtikirjoituksiini tulee, on ystäväni kirkkoherra


Teofilus Tiennäyttäjä kertonut, että hänelle ne hänen kaukaisessa
erämaanpitäjässään tuottivat mitä suurinta nautintoa niin sisällyksen
kuin tyylinkin puolesta. Hän oli varta vasten tilannut »Kuivalan
Sanomat», saadakseen seurata mainetöitäni. Hän oli näet kuullut
minusta paljon kerrottavan, vaikka ei ollutkaan vielä silloin
mieskohtainen tuttavani. Ja omasta puolestani minä annan suuren
arvon tälle tunnustukselle, sillä kirkkoherra Tiennäyttäjä on jonkun
verran kirjallisiin asioihin perehtynyt mies. Hän on nim. julkaissut
pari runokokoelmaa nimeltä »Kukon laulu» ja »Aatamin omena»,
joissa hän esittää hiukan omituisia uskonnollisia mielipiteitään.

Mutta — oli miten oli, minä olin jälleen saanut kokea, että maailma
vihaa soihdunkantajia. Niitä, jotka se myöhemmin on julistanut
merkkimiehikseen, se on kiduttanut ja vainonnut heidän eläessään.
Minun tarvitsee vai viitata historiaan. Kolumbus löysi Amerikan,
mutta toinen mies, turhanpäiväinen turisti, antoi sille nimensä.
Minun koskenlaskuni oli tavallaan Amerikan löytö sekin: se avasi
ainakin filmiyhtiö »Ihanteelle» tien rikkauteen. Mutta minä olen
jäänyt tästä rikkaudesta osattomaksi. Mainittu yhtiö on näytellyt
»Koskenlaskijan kosintaa» ympäri valtakunnan, myynyt filmin
Pohjanlahden toiselle puolenkin ja niittänyt sieltä kruunuja ja
kunniaa. Mutta minä, joka tein yrityksen mahdolliseksi, saan kitua
puutteessa uuden Kolumbuksen tavoin. Olen kuitenkin iloinen, että
olen tämän kautta tullut mahdolliseksi saamaan nimeni
sivistyshistorian lehdille. Sillä olen varma, että kun kerran kirjoitetaan
filmitaiteen historia, minun nimeni mainitaan siinä Chaplinin ja
Valentinen nimien rinnalla. Ja se lohduttaa minua.

Ken ompi runoniekka? Sekö vain, jot' oma koulukunta


kilvan kiittää, ja jonka eessä tietä aukiniittää kuuluttajitten
joukko kopeain?

Ken ompi kuningas? Se vainko vain,


jok' kultavaljakolla maata ajaa
ja ritarlinnoissa vain pitää majaa
keralla valtaherrain korskeain?

Ei! Runoniekka ompi myöskin hän,


jok' itsens' elämässä laulaa läpi.
Ei kateus häntä kyntysille näpi:
hän toogaan peittää päänsä ylvähän.

Se tooga oman arvon tunto on


ja tieto siitä, että veitsi viiltää.
Sen miehen päässä yksin kruunu kiiltää.
Hän kuningas ja runoilija on!
XIV.

MINÄ TUTUSTUN KIRKKOHERRA TEOFILUS TIENNÄYTTÄJÄÄN JA


SOLMIN VELJESLIITON HÄNEN KANSSAAN.

Olen elämäkertani kuluessa useamman kerran maininnut


kirkkoherra Teofilus Tiennäyttäjästä ja varmaankin tehnyt lukijan
uteliaaksi. Pitkin matkaa lienee myös käynyt selville, että hän on
minun elämässäni ollut verrattain tärkeä tekijä, koskapa tavan takaa
olen häneen viitannut. Eikä lukija tässä erehdykään; asianlaita on
niin. Tämä omituinen mies on nim. yksi niitä harvoja, joka on
parhaiten ymmärtänyt minun sielunelämääni.

Ei sen vuoksi, että hän runoilijana olisi mikään etevä. Päinvastoin


minun täytyy — koska kerran edessäni on valkoinen paperiarkki,
jonka runoilijaveljeni Jouko Touko kerran määritteli »kauhistuttavaksi
kappaleeksi taivaankannen alla» — totuudessa pysyäkseni todeta,
että hän runoilijana oikeastaan on heikonpuoleinen. Olen nim.
lukenut hänen runovihkosensa ja minun täytyy sanoa, että ne ovat
mitä viheliäisintä sekasotkua estetiikasta, filosofiasta ja teologiasta
— jos ne nyt ovat sitäkään. Vai mitä arvoisa lukija arvelee esim.
tällaisesta palasesta, joka löytyy hänen »Aatamin omena»-nimisessä
kokoelmassaan:
»Oi, Aadam, mikä onni olikaan, ett' tarttui kurkkuhan tuo
sinun palas! Nyt juomalla sen koitan saada alas, mut aina
löydän sen taas paikaltaan!»

Ensinnäkin — tämä on sangen omituinen säkeistö pappismiehen


kirjoittamaksi. Laskea leikkiä raamatun omenasta ja ylistää sen
kustannuksella juopottelua — näin kieltolain aikana. Sillä, mitenkä
tätä muutenkaan voisi tulkita. (Selvyyden vuoksi sanottakoon, että
on suuri ero »runoilijaryypyn ja juopottelun välillä.)

Ja toiseksi: verrata runoudessa sitä pientä, siroa, punaposkista


omenaa, jonka Eeva ojensi Aadamille, miehen kurkunpäähän —
vaikka kansa kömpelyydessään kyllä tuota vertausta käyttääkin — on
luvalla sanoen epäesteettistä. Omena ja anatomia ovat silloin kovin
kovakouraisesti pakotetut naapureiksi toistensa kanssa.

Ja kolmanneksi: mistä jumaluusopillisesta lähteestä ystäväni


Teofilus on saanut sen tiedon, että omena tarttui Aadamin kurkkuun?
Mahtoikohan Kuivalan seurakunta ollakaan niin kovin väärässä,
syyttäessään kirkkoherraansa harhaoppiseksi?

Ja sellaista on tämän omituisen papin »runous» kauttaaltaan.


Täynnä ajatuksia, joiden perille toisinaan on mahdoton päästä, joita
ei yksinkertaisesti ymmärrä. Olen joskus kysynyt häneltä
itseltäänkin, mitä hän esim. tuolla edellämainitulla värsyllä oikein
tarkoittaa. Hän on silloin pudistanut suurta pörröistä päätään ja
sanonut: »En mie tiiä… se on vain sellainen piirto…»

Tällaisia »piirtoja» ovat hänen molemmat runokokoelmansa


täynnä. »Mie runoilen leppuuttaaksen ajatuksian, tai paremmin: 'Mie
viheltelen ajatusten puutteessa', niinkuin Pyyron sannoo». Merkillisiä
runoja!
Mutta — palatakseni pääasiaan — kirkkoherra Teofilus
Tiennäyttäjä ei ymmärrä minua senvuoksi, että hän olisi runoilija,
vaan että hänellä muuten on sellainen merkillinen kyky »ryömiä
koijuun» — niinkuin hän sen itse tulkitsee. Ja tänä koijuna on kerran
sattunut olemaan minun paljonkärsinyt sydämeni.

En silti tahdo sanoa, että hän osaisi erikoisesti lohduttaa, en —


(minä haluaisin kerran olla läsnä, kun hän keskustelee sairaan
kanssa) — vaan hän asettuu mukavasti »maata» niinkuin koira
koppiinsa ja hänen olemuksestaan saattaa silloin lukea: »Mie oun nyt
tässä». Se on jonkinlaista henkisen mukavuuden rakkautta.

»Sinun syämmes, Aatami, on kuin koirankoppi», sanoi hän minulle


kerran. »Sinne soppii parahiks tällainen karvaturri kuin mie. Annapas
nyt hetken vartioin sinun pihasi turvallisuutta.»

Tällaisilla sanoilla hän houkuttelee minut kertomaan elämästäni.


Hän kuuntelee silmät puoliummessa, nojaten mukavasti tuolin
selustaan. Ja jokainen, joka vähänkin on kokenut, kuinka hyvältä
tuntuu avata sydämensä jollekin ihmiselle, ymmärtää, minkä
helpoituksen tuollainen kertominen minulle tuottaa.

Mutta — ennenkuin rupean laajemmin esittelemään ystävääni,


tahdon kertoa tutustumisestamme. Minä olin jo Perä-Pohjolassa
kuullut hänestä. Ja se, mitä olin kuullut, oli melko omituista.
Sanottiin hänen kuluttavan aikaansa makaamalla. Kirkosta tultuaan
hän lyö maata, nukkuu päivälliseen saakka, nousee sitten syömään
ja syö tavattomasti, jonka jälkeen hän heittäytyy jälleen pitkäkseen
ja herää siihen, että palvelijatar tuo hänelle iltapäiväkahvin. Sen
juotuaan hän ottaa vielä pikku unet, nousee sitten julmasti
haukotellen ja lähtee kylälle pitämään raamatunselitystä. Ihmiset
kokoontuvat uteliaisuudesta kuulemaan, mitä tällä palloa
muistuttavalla pappismiehellä on sanottavana. Ja jotakin hänellä joka
kerta on. Kerran hän oli saarnannut jäniksen langoista eikä
kuulijakunta ollut käsittänyt hölynpölyä. »Mitä sinä, Teofilus, silläkin
tarkoitat?» kysyin häneltä kerran. »No… se oi sellainen piirto…» Ja
hän teki kädellään velton liikkeen kuin näyttääkseen, mitä hän oli
tarkoittanut. »Mie saarnaan leppuuttaaksen ajatuksian tahi
paremmin, niinkuin Pyyron sannoo…» Siis saarnat samallaisia kuin
runotkin! (Millä ihmeen ajalla hän sitten ajattelee, kun hän väliajat
nukkuu?) Minä luulen sittenkin, että tuo hänen alituinen
vetoamisensa Byroniin tarjoaa minulle tässä tapauksessa sen
kriterion, joka selittää asian: ystäväni Teofilus ei ajattele mitään.
(Mutta — kuinka hän sitten kykenee ymmärtämään minua? Ei —
minä huomaan, etten pysty tätä ongelmaa ratkaisemaan.)

No niin. Minun kotiseurakuntani naapurissa tuli joku vuosi sitten


kirkkoherranvirka auki. Satuin olemaan sielläpäin käräjillä ja silloin
kääntyivät pitäjän miehet puoleen pyynnöllä, että kirjoittaisin
kirkkoherra Tiennäyttäjälle ja anoisin häntä heidän puolestaan
neljänneksi vaalisaarnaajaksi. (Hänen nimensä on oikeastaan
Teofilus Takkunen, vaikka minä olen ristinyt hänet
»Tiennäyttäjäksi».) Tämä pyyntö ei suinkaan johtunut siitä, että
kirkkoherra Tiennäyttäjä olisi ollut erikoisemmin suosittu, ei — vaan
siitä, että seurakuntaan oli sattunut hakemaan vähemmän
tunnettuja miehiä. Teofiluksesta ei tietty muuta kuin että hän nukkuu
ja se ei pitäjäläisten mielestä ollut kovinkaan suuri paha. Eipähän
niin ollen pistänyt nokkaansa joka paikkaan. Minä siis kirjoitin hänelle
seurakuntalasten puolesta ja esitin asian parhaimman mukaan.

»Se sinun kirjees oi oikea runollisuuven purkaus». sanoi hän


minulle kerran, puheen johtuessa näihin vanhoihin muistoihin. »Sen
hornastako sie sieppasit ne alapasteripylväät?» jatkoi hän
haukotellen.

Minä olin kirjoittanut lennokkaasti. Edellytin nim., että kirjoitin


kirjailijamiehelle, joka ymmärtäisi Olin kiittänyt tuon pohjoisen
pitäjän seutujen kauneutta ja siteerannut »Perä-Pohjolaani», jossa
vertaan m.m. kuusia alabasteripylväisiin. Mutta jälkeenpäin olen
huomannut kirjoittaneeni melko proosalliselle herralle, joka ei tee
muuta kuin syö ja makaa.

Tämä ensimmäinen tutustumisemme tapahtui siis kirjeen


välityksellä. Ystäväni Teofilus vastasi, ettei hän viitsinyt hakea, koska
oli juuri muuttanut seurakuntaansa. (Tämä on muuten hänen
lempisanojaan — »viitsi, viitsinyt».)

Seuraavan kerran tapasimme Kuivalassa. Oli käynyt niin


omituisesti, että Teofilus Tiennäyttäjä pääsi papiksi samaan
seurakuntaan, jossa minä palvelin nimismiehenä.

En tänäkään päivänä ymmärrä, millä ihmeen tempulla hän sai


äänet tänne. Hänen vaalisaarnansa oli täynnä »piirtoja», mutta
harva taisi käsittää, mitä hän tarkoitti. Siksi epäselvää oli saarna
alusta loppuun saakka. Mutta hän pääsi kuin pääsikin, — luultavasti
sen vuoksi, koska oli niin kaukaa. (Sivumennen sanoen, agiteerasin
minä hänen hyväkseen innokkaasti, vaikka en agitatsiooniani
osannutkaan perustella muulla syyllä, kuin että hän oli »siivo ja
hiljainen mies». Hänen runsaasta unen lahjastaan en luonnollisesti
uskaltanut hiiskua mitään.)

Teofilus Tiennäyttäjä pääsi siis Kuivalaan ja me jouduimme paljon


tekemisiin toistemme kanssa. Ja minun täytyy sanoa: ensi päivästä
alkaen olemme eläneet ystävinä, niin kummalta kuin se saattaa
kuuluakin.

Tällä paikkakunnalla ei muuten ole helppo löytää ystäviä. Onhan


täällä virkamiehiä paljonkin, mutta sellaista, jonka kanssa voisi
keskustella runoudesta ja taiteesta, sangen vähän —
lukuunottamatta täällä asuvaa taiteilijakoloniaa. Mutta sen
jäseniähän ei tapaa joka päivä, sillä he asuvat hajallaan. Jota vastoin
ystäväni Teofilus, asuen aivan naapurissa, pistäytyi luonani harva se
päivä. (Tässäkin muuten omituinen seikka. Minä en itse käy koskaan
missään, en lähimmässä naapurissakaan. Mutta minun luonani käy
taas vieraita paljon. Mistähän tämä johtuu?)

No niin — Kuivalan virkakunnasta en ollut suuria hyötynyt.


Asemapäällikkö Anders Klerck oli kyllä paljon lukenut mies, mutta ei
tuntenut harrastusta muuta kuin filosofiaa kohtaan. Uskonnolliselta
vakaumukseltaan hän oli ateisti — tahi jokseenkin lähellä tuota
kantaa. Mutta — vaikka hän olikin oppinut herra, ei hän pystynyt
väittelemään kanssani. Sillä teologian alalla hän on kuin merimies
maalla: hän hoipertelee ja hänet on siis helppo kaataa. Monta kertaa
olemme iskeneet yhteen tämän herran kanssa jumaluusopillisista
kysymyksistä, mutta joka kerta olen minä jättänyt hänet sangen
pahasti rusikoituna taistelutantereelle.

Muut rautatien herrat ovat hiljaisia miehiä, joiden kanssa ei juuri


voi paljon keskustella. Heille tuntui riittävän vain virka ja sen hoito.
Mutta tässä minä erehdyn, kuten etempänä saamme nähdä.

Kuten sanottu — ei ystäväni Teofilus isosti ymmärrä taidetta,


mutta kuitenkin sen verran, että hän osaa vaieten paljastaa päänsä
suuren runouden edessä. Sen olen havainnut lukemattomia kertoja
lukiessani hänelle »Runoryijyäni». Sellaisina hetkinä hän ei ole
puhunut »piirroistaan», vaan on kuunnellut hartaana, ja minä olen
voinut lukea hänen kasvoistaan, kuinka hänen henkensä on vaellellut
siinä mahtavassa tuomiokirkossa, jonka holvikaaria runouden titaanit
kannattavat.

Joskus tuollaisten lukuhetkien jälkeen on hän innostunut —


varsinkin jos olemme ottaneet pienen napauksen — ja ruvennut
lausumaan »Jerusalemiaan». (Sen hän muuten aina tekee vissillä
asteella ollessaan.)

»Mikä liikkeelle noin pani kaupungin,


pyhän, mahtavan Jerusalemin?»

Silloin hän on tavallisesti naputellut pörröistä päätään, aivan kuin


sijaitsisi hänen Jerusaleminsa siellä.

Ja toisinaan, kun hän on oikein innostunut, on hän saattanut


hypähtää tuoliltaan ja huudahtaa:

»Peijakas! Oun se minnäi runoilija!»

Se on ollut minulle merkki, ettei Teofilukselle sinä iltana pitänyt


antaa tippaakaan enää.

Mutta silloin on jymy noussut kattoon, kun minä olen ottanut esille
okarinoni ja ruvennut soittamaan. Teofilus Tiennäyttäjä on nim.
hyvin musikaalinen. Häneen menee musiikki kuin häkä. Jos olen
soittanut surullista, on hän itkenyt, jos taas olen pyöräyttänyt ilon
puolelle, on hän nauranut ja tanssinut. Silloin ei häntä ole yhtään
haitannut hänen tavaton lihavuutensa. Olen toisinaan nähnyt hänen
tanssivan kyyneleet silmissä, kun »Voi äiti parasta» kiepahutin
»Eklöfin Aukustiksi». Minunkin on silloin täytynyt nauraa hänen
hölkälleen, kun hän on pomppinut tuolin kanssa juuri kuin kumipallo.
Hiki virtasi hänen pyöreiltä kasvoiltaan, jotka olivat vääntyneet
suloisen tuskalliseen irvistykseen. Hänen naamansa muistutti
sellaisina hetkinä kuuta, joka kyynel silmänurkassa nauraa.

»Helekkari, kun on lystiä taas!» on hän sellaisen rytäkän perästä


huudahtanut. (Tämä hurskas pappismies napsauttaa joskus pienen
voimasanan). »Kyllä sie, Aatami, out suurenmoinen mies! Sie soitat
kuin Orfeus! Koulussa mie ajattelin, että mikkään instrumentti tuolla
muinaisajan sankarilla oli, kun hän soittosa avulla houkuttel
Eurytiiken Manalasta. Mutta nyt mie ymmärrän:… sen on täytynnä
olla okarino. Sen avulla nousee immeinen vaikka liejusta».

Hohhoijaa! Monta hauskaa hetkeä olemme Teofilus-veljen kanssa


viettäneet. Meidän rouvamme ovat meitä toruneet ja sanoneet
epänormaaleiksi. Mutta siihen on Teofilus-ystäväni huomauttanut:

»Emmehän myö normaaleita oukkaan. Sikspä myö ollaanni


runoilijoita.»

»Kuinka sinusta, Teofilus, on tullut pappi?» kysäisin häneltä


kerran.
»Sinä olisit parhaiten sopinut kellarimestariksi.»

Hän teki kädellään liikkeen kuin näyttääkseen, että tällä kertaa olin
minä tehnyt »piirron», ja lausahti:

»Siin on tullunna erreys. Maanmittaria minusta on aiottu.»

»Maanmittaria!» huudahdin minä. »Kuinka ihmeessä sinä tuolla


ruholla olisit jänkiä tarponut.»

»Kaipa ois ruho muovostunna viran mukkaan.»


Hän imaisi laiskasti sikariaan ja jatkoi:

»Katsohan, kun taivaassa oi luotu virkakunnat, asetti Jumala ne


seisomaan taivaan avaralle pihalle pitkään rivviin. Ensimmäisinä
seisoivat maanmittarit, sillä — koska maa oi vasta luotu, pit näijen
lähteä uutistalon paikkoja mittaamaan ja maata kartottammaan.
Heijän perässään seisoi taas pappien pitkä jono, sillä — kun talot ja
asumukset oli kerta saatu reilaan, pit näijen lähteä kansaa
opettaminaan. Eihän papit ou milloinkaan palijaan taivaan alla
kinkereitä pitännä eikähän se kävis päinsäkään, koska ensmäisen
satteen sattuessa kirkonkirijat kastuisivat.»

»No niin. Mie olin viimeinen maanmittareista. Siihen virkakuntaan


minut oli määrätty. Miten nyt sattuikin, — niin arkkienkel Mikael,
jonka käen viittauksella pit lyyä rivi poikki sitä mukkaa kuin kunkin
virkakunnan vuoro joutui, tul jostain syystä hajamieliseks ja kiinnitti
huomionsa toisaalle. Hänhän ylimpänä kirjanpitäjänä on sentään
meleko jämtti mies. Mutta tällä kertaa käv kuitenni niin, että kun
Jumala huus: 'Anna etupään huilata!' hän löi rivin poikki väärästä
kohtaa, niin että mie jäin pappien joukkoon. Kun sitten tää
virkakunta ol saanna käskyn lähteä, huomattiin erreys. Mikael huus:
'Nyt käv hullusti! Tiennäyttäjä joutui pappien joukkoon'. Meijän jono
oi jo silloin painamassa etteenpäin mitä tulisinta vauhtia ja lihavat
rovastit tyrkkivät minua niskaan, kun en lyhyillä jaloillan kyennä
kyllin noppeest pakenemmaan. Jumala huohmas, että jottain oi
hullusti ja kysyi: 'Mikä nyt?' Hänelle selitettiin asia ja meitä huuettiin
pyssäymään. Mie öisin kyllä totellunna kehoitusta, mutta
perässätulijat painoivat vain päälle. Heill' ol kiiru kappojen kantoon,
sillä he olivat kuulleet, että Sinearin maassa parastaikaa puitiin.
Jumala tuumi hetken, kynsäis korvallistaan ja lausui: 'No olokoon…
ehkäpä hän siellä menettellee' ja antoi meijän jatkaa matkaa. Näin
Welcome to our website – the ideal destination for book lovers and
knowledge seekers. With a mission to inspire endlessly, we offer a
vast collection of books, ranging from classic literary works to
specialized publications, self-development books, and children's
literature. Each book is a new journey of discovery, expanding
knowledge and enriching the soul of the reade

Our website is not just a platform for buying books, but a bridge
connecting readers to the timeless values of culture and wisdom. With
an elegant, user-friendly interface and an intelligent search system,
we are committed to providing a quick and convenient shopping
experience. Additionally, our special promotions and home delivery
services ensure that you save time and fully enjoy the joy of reading.

Let us accompany you on the journey of exploring knowledge and


personal growth!

textbookfull.com

You might also like