JS Puzzlers

Are you sure you know JavaScript ? (remake)

JS features usage overview

State of JS 2019

Syntax

Spread operator

function* gen() { 
  yield 1;
  yield 2;
  yield 3;
  return 4;
}

console.log([...gen()]);

What will be the output ?

What is "Spread Operator" exactly does ?

The spread operator is used to expand elements of an iterable (like an array) into places where multiple elements can fit.

What is an iterator ?

Object that knows how to access items from a collection one at a time, while keeping track of its current position within that sequence.

The iterable protocol

In order to be iterable, an object must implement the @@iterator method, meaning that the object (or one of the objects up its prototype chain) must have a property with a @@iterator key which is available via constant Symbol.iterator:

Iterator object have a next() method which returns the next item in the sequence.

This method returns an object with two properties: done and value.

{value: ‘Current value of iteration’, done: ‘true/false’}

const genInstance = gen();

genInstance.next();
//{value: 1, done: false}

genInstance.next();
//{value: 2, done: false}

genInstance.next();
//{value: 3, done: false}

genInstance.next();
//{value: 4, done: true}

Spread operator doesn't count objects with "done: true"

function* gen() { 
  yield 1;
  yield 2;
  yield 3;
  return 4;
}

console.log([...gen()]);

// [1, 2, 3]

Destructuring

const data = {
   a: 1,
   b: undefined,
   c: null,
}

const { a = 2, b = 3, c = 4, d = 5 } = data;

console.log(a,b,c,d);

What is the output ?

Destructuring supprts default values

Null !== undefined

Arrow functions

How to distingwish between plain old function with an arrow function ?

function isArrowFunction(fn) {
  return /* ? */
}

isArrowFunction(() => console.log(1)) // true
isArrowFunction(function(){console.log(2)}) // false

prototype does not exist for an arrow function.

More puzzles ?

Is this valid ?

const x = {[{}]:[{}]}

What is the actual value of x ?

What is the actual value of y ?

const y = {[{}](){[]}}

What about this one ?

Data structures

Maps

Why we need Map() if we can use just objects ?

const map = new Map();
map.set("hello world", "💩");
map.get("hello word"); // 💩

const map2 = {};
map2["hello word"] = "💩";
map2["hello word"]; // 💩
  • The key difference is that Objects only support string keys where as Maps support more or less any key type.
  • A Map object can iterate its elements in insertion order

Map vs objects

Sets

NaN === NaN ?

NaN == NaN ?

false

new Set().add(NaN).add(NaN)
// ???

So will we have Two NaN's or only One ?

APIs

Fetch

Everyone knows about it, right ?

const promise = fetch(url) 
  .then((response) => {
    return response;
  })
  .catch((err) => {
    console.log(err);
  });

Fetching some data...

And response doesn't come for a while...

Abort a fetch ?

Axios has build-in cancel() method which gives you an opportunity to abort requests which aren’t yet resolved or rejected.

Native fetch API ?

AbortController !

Represents a controller object that allows you to abort one or more Web requests as and when desired

const url = "https://api.github.com/users";

const controller = new AbortController();
const signal = controller.signal;

const promise = fetch(url, {signal}) 
// you can see we pass signal to fetch params
  .then((response) => {
    return response;
  })
  .catch((err) => {
    console.log(err);
  });

controller.abort();

Example

Browser compatibility

Local Storage

const parent = { child: { hi: "all" } };
localStorage.setItem("parent", parent);

console.log(
  localStorage.getItem("parent").child  // ?
);

What will be the output ?

Local storage can only store string pairs!

To store objects in LocalStorage you have to stringify them

JSON.stringify(category1); ???

We can't stringify circular references!

How to store two-way linked lists/trees then ?

JS Puzzlers

By Vladimir Vyshko

JS Puzzlers

  • 408