This is a review of a more technical book, Eloquent JavaScript by Marijn Haverbeke. The book has the appearance of being about learning programming from scratch but I suspect anyone using it as such would struggle. However, if you have some background in programming it is something of a delight.
The book is divided into three parts, on JavaScript itself, the web browser, and node.js – where JavaScript can run without a browser. Along with a description of the core features of the language there are some significant examples, elaborated over full chapters.
These are quite engaging although a bit off the wall. One concerns were-squirrels, another crows, making a pixel art editor and a platform game seem rather tame in comparison. These examples show you how you should use language features, rather than just giving you a pile of bricks from which to construct your building.
JavaScript has evolved since it was first introduced in 1995 with a major update in 2015 including modules, promises, and generators amongst other things – Haverbeke covers these (highlighting what is new). This is useful to know since I started programming in JavaScript a while back where I observed, for example, that arrays were looped over by index, but now I find I no longer need to do this.
Coming to JavaScript from another language I find the event driven, asynchronous features of the language most difficult to understand, and the older JavaScript way of using callbacks to handle these features produces code which is difficult to read – certainly to my eyes. Promises offer a clearer way of implementing asynchronous code.
Importing modules still feels like an area undergoing much needed development. Originally JavaScript had no built-in functionality to handle modules, but this gap was filled with third party libraries. Now module management has been built into the language but a lot of legacy code uses incompatible third party libraries, and node.js doesn’t fully support the new module features (as far as I can tell). Haverbeke mentions how some of these difficulties are handled with the toolchain associated with JavaScript.
JavaScript seems to have some pretty wacky features: month numbers start at zero, exactly like absolutely no system of date description I have ever seen. The case-switch syntax seems really odd, although I understand it is inherited from C/Java like languages. JavaScript’s try/catch functionality is indiscriminate by default which is considered bad style in Python although there are workarounds for this.
Although I’ve been working with browsers and JavaScript for the last 6 years or so, I still learnt new things about how browsers work. Such as the different applications of the onclick attribute and addEventListener, the former only allows for one listener per element.
One of the examples uses “long polling” to demonstrate how to update a web page at regular intervals, or when the content changes due to actions elsewhere.
The material on node.js was new to me. I’m aware I should probably be writing tests for my JavaScript code, and node.js is the easier way of doing this. node.js is based on the Chrome V8 JavaScript engine with extensions for handling Input/Output amongst other things, features which belong on the server side rather than the browser, client side.
I quite like that, in common with Python, JavaScript uses convention to make class methods private. Basically programmers agree not to use a method if it’s name starts with an underscore!
Python (my favoured language) and JavaScript both have the air of being little things designed to smooth your path rather than serious languages for serious projects like C, C++, Java, Fortran, and C#. However, Python is arguably the most important language in data science applications and many of the big internet companies have significant investment in Python code. Whilst JavaScript is arguably the most important language in the world at the moment, almost everything that happens in a web browser has JavaScript behind it.
The book finishes with a chapter on performance, I found this really interesting. JavaScript engines have a multi-stage approach to compiling JavaScript into executable code. It starts with a quick and dirty compile, but then returns to do optimisations if code is run frequently. Somewhat disconcertingly different JavaScript engines handle the programmers attempts at optimisation differently i.e. you can optimise your code for Google Chrome only to discover it runs more slowly in Microsoft Edge.
There’s no description of the JavaScript dev environment or tool chain in Eloquent JavaScript. Although I missed this it is probably best not to include in a book such as this – tools change rapidly and what works for one developer doesn’t work for another both in aesthetic and practical terms.
I think this is one of the most enjoyable programming books I’ve read. It covers the core features of the language concisely but then goes on to illustrate how to use those features. It also discusses the key environments in which JavaScript runs.