My Favorite JavaScript Language Feature

Recently on one of the social network feeds, there was a long thread of developers putting their input into the question: “What is your favorite JavaScript feature.”

Most people were putting in things like object destructuring, closures, map-filter-apply, reduce, spread operators, promises, arrow functions, first-class functions, eval, async and await. One person even answered with a code sample and another mentioned the use of closure with a block declaration as a model for scope. A block declaration is the use of the ({ … code … }) structure.

function pwrGen() {
    var i = 0;
 
    return {
        next: function() {
 
            var ret = Math.pow(i, 2);
            i++;

            return ret;
        }
    };
}

var gen = pwrGen();

console.log(gen.next(), gen.next(), gen.next()); // -> 0 1 4

Something that I’ve grown to appreciate is the Truthy and Falsey properties, which I think only one other person among hundreds gave mention to.

Here’s why: because JavaScript is a loosely typed language, it handles certain types of conversions in context of the statement they’re in. This provides a way to do a unary collates, quickly identify value, and quick boolean conversions.

Unary Collation

console.log(true && 'all prior conditions are true');

console.log(false || 'all prior conditions are false');

Is There Value?

if (!!thisVarHasValue) { ...

In this example, we can use the bang operator to quickly convert any variable into a boolean. However, there are some caveats.

Can you handle the Truthy?

As you may have noticed in the prior example, there are two bang operators. The first bang operator changes the variable to a boolean type. The second one reverses that. As a result, if the variable “thisVarHasValue” has a value, it results in a True response … with a few exceptions.

The values undefined, 0, and 0.00 and NaN all produce false values. Empty strings also produce a false value. However, empty arrays and strings of zero values produce a true value.

Quickening

Efficiency is on the mind of any good coder. I like to run small benchmarking programs to get numbers when I haven’t come across other posts that do it. Below is a short program that you can run on JSFiddle. It takes a million rows then iterates through them using a single-bang (falsey) and a triple bang (double-falsey) operator compared to a typical undefined-or-zero comparison.

var a = [];

var div = document.getElementById("answer");

div.innerHTML = !!a;

for (var x = 0; x < 1000000; x++) {

  a.push(x);

}



// [Call to doSomething] took 17399.999999965075 milliseconds.


var t0 = performance.now();


for (var x = 0; x < 1000000; x++) {

  if (!a[x]) {
    a.push(x);

  } else {
    a.push(x);

  }
}


var t1 = performance.now();

div.innerHTML = "Single-bang took " + (t1 - t0) + " milliseconds.";





var a = [];

t0 = performance.now();


for (var x = 0; x < 1000000; x++) {

    if (!!a[x]) {
      a.push(x);

    }
}
t1 = performance.now();

div.innerHTML = div.innerHTML + "<br/>Double-bang took " + (t1 - t0) + " milliseconds.";





var a = [];

t0 = performance.now();


for (var x = 0; x < 1000000; x++) {
    if (!!!a[x]) {
      a.push(x);
    }
}
t1 = performance.now();

div.innerHTML = div.innerHTML + "<br/>Triple-bang took " + (t1 - t0) + " milliseconds.";





var a = [];

t0 = performance.now();


for (var x = 0; x < 1000000; x++) {

    if (a[x] === undefined || a[x] === 0) {
        a.push(x);
    } else {
        a.push(x);
    }
}
t1 = performance.now();

div.innerHTML = div.innerHTML + "<br/>Condition checking took " + (t1 - t0) + " milliseconds.";

The result is somewhat consistent. The double-bang is the fastest, followed by the triple-bang, the single-bang, and finally, the typical condition check:

Single-bang took 3.2000000355765224 milliseconds.
Double-bang took 2.899999963119626 milliseconds.
Triple-bang took 3.000000026077032 milliseconds.
Condition checking took 3.2999999821186066 milliseconds.

But remember, this is across a million rows. a tenth of a millisecond doesn’t amount to much. This was an exercise to see if there was something substantial to use in optimizing code and to peek into the JavaScript engine’s behavior.

What I find interesting is how the triple-bang, which is the same value as the single-bang, is somehow just slightly faster. I’ll have to do a follow-up later as to why this is the case.

A Little React Fun

Here’s a game that I created where you pick a movie with the highest iMDB rating… and some things I learned making it.

Click Here to Play the React Christmas Movie Quiz!

I enjoy tinkering around with different technologies, and where I sit today, most businesses want React. I looked into it a little over two years ago, but Angular 2 was the hot number, so my focus was on that at the time. Over the Christmas weekend, I cracked open some Pluralsight videos, blogs and pieced together a fun little quiz application.

It lacks the polish I would have liked, but there’s enough in place to demonstrate that I’ve learned a few things and had fun at it.

Rather than going into the standard talk about React mojo: bindings, scope, virtual DOM, functions, classes, ES6, TypeScript, etc. I’m just going to go over a couple of specific areas that I got stuck on and found interesting.

  1. Use setState instead of your typical assignment when applying changes to the state.
  2. It’s very Dependency Inversion based. Pass the method definitions from the highest level (where your state is) down.
  3. Those aren’t HTML tags, they’re JSX. They’re a shortcut to the mojo.
  4. If something isn’t updating, check the context of your props.

And some not-so-technological stuff I learned:

  1. Give the user some context for the data. At first, it didn’t load thumbnails. It loads them, but they’re still too small. Nevertheless, there’s a reason why icons are so popular. They give us context.
  2. Give the user some reference for the data. Like the thumbnails, the app didn’t used to show the IMDB link after the user made their selection. There were quite a few times when a movie popped up and I thought “Hey! What’s that movie about?” Now I have a way to learn.
  3. Don’t stuff the interface with data. I also had the list of actors, synopsis, rating, etc. That was way too much information that just cluttered up the UI. The user might still want that information to make their pick, but it’s meta. It’s auxiliary. In short, it’s unnecessary.
  4. Form is not function. My laptop dumped my changes because of Apple’s Touch Bar. Nice little invention if it’s needed, but because my knuckle hit a little virtual button, a day of tinkering was lost. I found several other strong rants from developers against the Touch Bar, which ensured me that I was in good company with my frustration.

Click Here to Play the React Christmas Movie Quiz!

So what’s next regarding this app? I have a list of features and behaviors that I’d like to see. What I add into it depends on the time I have and the priority to tinker and learn. I showed the current product to a friend of mine who has a good eye for UI and she pointed out some overall design changes which we sketched out:

The list below is incomplete and isn’t in any particular order:

  • UI looks rough. Clean it up as follows:
    • Change input from lines to boxes. This will improve spacing and provide more real-estate to the movie poster images.
    • After each answer is selected, provide a “Next” button instead of a “Play Again” until all 10 questions have been picked.
    • Show the number of correct and incorrect answers with colored icons and the number of remaining questions with a grey one. For example, use little colored elf shoes for correct answers, black elf shoes for wrong answers and grey outlines for those not answered yet.
    • Show larger thumbnails with little text beneath.
    • In the little text beneath the posters, show an iMDB badge that the user clicks on to go to the site instead of the current text. Also show the rating on the upper-right corner of each block in a circle.
    • When a poster is not available, show a generic greyed out “Poster Not Available” image.
    • Do better in filtering out the embarrassing movie titles that sometimes show up. (either an IMDB ID filter or a title filter).
    • The “Play Again” button only shows after all 10 attempts have been used up, effectively restarting the game.
    • Better colors for hovering, for correct answers and for incorrect answers.
    • Add a little “X” or Check mark for wrong/right selected answers.
    • Hold the space for the movie blocks so that the items on the bottom of the screen don’t jump up to the top while the next round is being pulled from the web service.
    • Put a placeholder for the movie blocks while their promises are getting filled, then populate them with the actual content.
    • Perhaps add a “Skip” button?
    • A Cleaner and more modern representation of each movie block.
  • A final rating from 0 (“Cotton-Headed Ninny Muggins”) to 10 (“Santa Clause Prodigy”) and every variant of Elf-isms in between (taken from my wife’s favorite holiday movie, Elf).
  • A top-score billboard. (Let the user enter in a few characters, but scrub it for profanity).
  • Make the product take “themes”. Themes would direct the engine to certain types of movies (e.g. “Musicals”), color schemes and icons, and top-score tables.
  • Allow the user to select which “theme” to play.
  • Download the values from the OMDB system into a local MySQL database and create a back-end PHP page that mediates the requests. This would allow me to get around the 1,000 request limitation and filter out crazy films from the game.
  • Allow user to change the game from using the iMDB rating to using Rotten Tomatoes.
  • Put a title and instructions at the top of the game board.
  • Add an informational badge within each movie block that allows user to see the actors and plot line. (Which year was that Christmas Carol with Patrick Stewart?)
  • Offer a secure feedback form as a fresh pop-up from a link on the game page so people can make suggestions without this blog getting injected with a hack-job.
  • The list could go on, but I think I’ve touched on the main faults and hit a few extra “nice-to-haves” in this existing list.

Part of software design with unfamiliar technology is to throw something out there, get a feel for what works and what doesn’t, then either rewrite or build upon what you’ve got. There were a few throw-aways while I built the current game and one accidental code loss that forced me to rewrite about a third of the code. But I learned a good deal, and am proud of what I learned far more than the current state of the movie game.

Nevertheless, I hope you have fun with it. If you have any questions as to its design or have any suggestions – please drop me an email.

Cheers!

Updated Geocaching Coordinate Calculator

Open the Popup Coordinate Distance Calculator

In Geocaching there is a type of cache called a “Multi”, or “Multi-Cache”. It requires the user to locate an initial cache that provides directions to the next cache, which when found provides directions to another cache, and so-on until the final cache is found. My initial thoughts to these type of caches were that they are like the old fictional pirate treasure maps.

I’m sure you’ll recognize the following excerpt from a popular 80’s movie:

Mikey pulls out the doubloon and verifies another critical alignment.

Mikey: Guys...I think I have a match. I'm sure of it! The lighthouse, the rock, and the restaurant all fit the doubloon. That must mean that the rich stuff is near the restaurant. So, (pulls the map out of his shirt), wait a second, Mouth, I'm going to need you to translate the map because I don't understand Spanish. (Pointing) Right here.

Mouth: (Looking at the map) Alright, alright, alright. (Reading) (spanish)

Mikey: What does that mean?

Mouth: Ten times ten.

Mikey: Uh, hundred.

Data: Hundred.

Mouth: (Translating) ...stretching feet to nearest northern point.

Mikey: North. What's north? Which way is north?

Mouth: That's where you'll find the treat.

Mikey: The treat...the rich stuff! The treat! The rich stuff. That's it!

Data: (Checks his compass and points) North is that way.

Now you can fulfill your childhood fantasies of joining Mikey’s gang in search for magical pirate treasure right from the convenience of this page.

I first attempted to create this calculator five years ago. My understanding of spherical coordinates was very limited – it still is – but I cracked open some websites and learned quite a bit. The trigonometry I did so well in during my time in High School was rusty, but I remembered enough that it was helpful.

It turns out this calculator was already placed up on NASA’s website a couple of years ago, though I’m not sure what algorithm they use. When doing research on that, I came across one of Wolfram Research’s pages on Spherical Trigonometry. Ah! Good head-spinning stuff… pun intended.

Sometimes it’s not a multi-cache, but a puzzle cache which would call for a calculator like this. Examples include the No Latitude and A-Rock-No-Phobia puzzle caches.

Here’s what to enter:

  • Distance (Feet) = the distance from the center point in feet. If you’re interested in metric entry and results, post a comment.
  • Heading (Compass Degrees) = the heading in compass degrees. 0 degrees is due North, 90 degrees is due East, 180 degrees is due South, and 270 degrees is due West.
  • Latitude of Origin = coordinates in the format “N XX° YYY.ZZZZ'” where N denotes North/South from a drop-down, XX is the degrees and YYY.ZZZZ is the decimal minutes. This is the common form that Geocaching.com provides for coordinates.
  • Longitude of Origin = the same as the Latitude, only for Longitude. It should now be able to handle W or E hemispheres to handle our friends on the other side of the meridian.

The Calculations are for nerds. The Results are for you. The coordinate results should display a link to Google maps when you’ve entered in all the criteria.

Update: 2017-06-15, I corrected the algorithm. Instead of using the angular distance, it uses a formula based on Haversine distance equation.

Open the Popup Coordinate Distance Calculator

Have fun and post a comment to let me know if it’s useful.