JavaScript
31.6K subscribers
1.17K photos
10 videos
33 files
842 links
A resourceful newsletter featuring the latest and most important news, articles, books and updates in the world of #javascript πŸš€ Don't miss our Quizzes!

Let's chat: @nairihar
Download Telegram
CHALLENGE

function* counter(start, end) {
for (let i = start; i <= end; i++) {
yield i;
}
}

function* pipeline() {
const first = yield* counter(1, 3);
console.log("Counter done:", first);

yield "bridge";

const second = yield* counter(7, 9);
console.log("Counter done:", second);
}

const gen = pipeline();

const results = [];
let next = gen.next();
while (!next.done) {
results.push(next.value);
next = gen.next();
}

console.log(results);
❀6πŸ‘2πŸ”₯1
CHALLENGE


const config = {
host: "localhost",
port: 3000,
db: {
name: "mydb",
maxConnections: 10
}
};

Object.freeze(config);

config.port = 9999;
config.db.maxConnections = 99;
config.newProp = "surprise";
delete config.host;

const sealed = Object.seal({ x: 1, y: 2 });
sealed.x = 100;
sealed.z = 999;
delete sealed.y;

console.log(config.port, config.db.maxConnections, config.host);
console.log(sealed.x, sealed.y, sealed.z);
πŸ‘2
CHALLENGE


async function fetchData(id) {
if (id < 0) throw new Error("Invalid ID");
return { id, value: id * 10 };
}

async function process() {
const results = await Promise.allSettled([
fetchData(1),
fetchData(-1),
fetchData(3),
]);

results.forEach(({ status, value, reason }) => {
if (status === "fulfilled") {
console.log(`fulfilled: ${value.id} -> ${value.value}`);
} else {
console.log(`rejected: ${reason.message}`);
}
});
}

process();
❀4πŸ‘3πŸ€”2
🀟 What’s Actually New in JavaScript (And What’s Coming Next)

If you don’t read the specs or endless posts about new language features, this is a great way to catch up. Most of the features are supported in Node, like Promise.try, Set union/intersection/difference, Array.fromAsync, and using, with others soon to land, like Math.sumPrecise and Map.getOrInsert (in Node 26).

Neciu Dan
Please open Telegram to view this post
VIEW IN TELEGRAM
❀7πŸ”₯3πŸ‘2πŸ€”1🀩1
CHALLENGE


const EventEmitter = (() => {
const listeners = new WeakMap();

return class {
constructor() {
listeners.set(this, {});
}

on(event, fn) {
const map = listeners.get(this);
(map[event] ??= []).push(fn);
return this;
}

emit(event, ...args) {
const map = listeners.get(this);
(map[event] ?? []).forEach(fn => fn(...args));
return this;
}
};
})();

const bus = new EventEmitter();
const log = [];

bus
.on("data", val => log.push(`A:${val}`))
.on("data", val => log.push(`B:${val}`))
.on("done", () => log.push("done"));

bus.emit("data", 1).emit("data", 2).emit("done");

console.log(log.join(" | "));
❀4πŸ”₯1
CHALLENGE


class Vehicle {
#speed = 0;

constructor(brand) {
this.brand = brand;
}

accelerate(amount) {
this.#speed += amount;
return this;
}

getSpeed() {
return this.#speed;
}

toString() {
return `${this.brand} @ ${this.#speed}km/h`;
}
}

class Car extends Vehicle {
#gear = 1;

constructor(brand, model) {
super(brand);
this.model = model;
}

shiftUp() {
this.#gear++;
return this;
}

toString() {
return `${super.toString()} [Gear ${this.#gear}]`;
}
}

const car = new Car("Toyota", "Supra");
car.accelerate(60).accelerate(40).shiftUp().shiftUp();

console.log(car.toString());
console.log(car instanceof Car);
console.log(car instanceof Vehicle);
console.log(Object.getPrototypeOf(Car) === Vehicle);
❀2πŸ‘1
CHALLENGE

const delay = (ms, val) => new Promise(res => setTimeout(res, ms, val));

async function pipeline(...fns) {
return async (input) => {
let result = input;
for (const fn of fns) {
result = await fn(result);
}
return result;
};
}

const double = async (x) => delay(10, x * 2);
const addTen = async (x) => delay(10, x + 10);
const square = async (x) => delay(10, x ** 2);

(async () => {
const process = await pipeline(double, addTen, square);
const output = await process(3);
console.log(output);
})();
❀1πŸ‘1πŸ”₯1
What is the output?
Anonymous Quiz
29%
256
49%
1024
16%
196
5%
324
❀1πŸ”₯1
CHALLENGE


const inventory = new Map([
["sword", { quantity: 3, weight: 15 }],
["shield", { quantity: 1, weight: 25 }],
["potion", { quantity: 10, weight: 2 }],
]);

inventory.set("bow", { quantity: 2, weight: 8 });
inventory.delete("shield");

const totalWeight = [...inventory.entries()].reduce((acc, [item, { quantity, weight }]) => {
return acc + quantity * weight;
}, 0);

const heaviestItem = [...inventory.entries()].reduce((max, [item, data]) =>
data.weight > max.weight ? { name: item, ...data } : max,
{ name: "", weight: 0 }
);

console.log(inventory.size, totalWeight, heaviestItem.name);
❀2πŸ‘2
❀3πŸ‘2
CHALLENGE

const ops = {
add: (a, b) => a + b,
subtract: (a, b) => a - b,
multiply: (a, b) => a * b,
divide: (a, b) => b !== 0 ? a / b : NaN,
};

const pipeline = (...fns) => (value) => fns.reduce((acc, fn) => fn(acc), value);

const double = (x) => ops.multiply(x, 2);
const addTen = (x) => ops.add(x, 10);
const halve = (x) => ops.divide(x, 2);
const subtractThree = (x) => ops.subtract(x, 3);

const transform = pipeline(double, addTen, halve, subtractThree);

const results = [5, 0, -4].map(transform);
console.log(results);
❀3πŸ‘2πŸ”₯1
1❀4πŸ”₯2πŸ‘1
CHALLENGE

const values = [0.1 + 0.2, NaN, Infinity, -0, 42.6789];

const results = values.map((v, i) => {
if (i === 0) return Number.isInteger(v) + " | " + v.toFixed(2);
if (i === 1) return Number.isFinite(v) + " | " + Number.isNaN(v);
if (i === 2) return Number.isFinite(v) + " | " + Number.MAX_SAFE_INTEGER;
if (i === 3) return Object.is(v, -0) + " | " + (v === 0);
if (i === 4) return v.toFixed(2) + " | " + v.toPrecision(4);
});

results.forEach(r => console.log(r));
❀3πŸ”₯2πŸ€”2
🀟 Node.js 26.0 (Current) Released

It's here! Complete with the Temporal API enabled by default, V8 14.6 (say hello to map β€˜upsert’ methods like Map.prototype.getOrInsert() and iterator sequencing with Iterator.concat()), plus Undici 8. v26 is the β€˜Current’ cutting-edge release until October when it gets promoted to LTS.

Rafael Gonzaga
Please open Telegram to view this post
VIEW IN TELEGRAM
❀4πŸ”₯3πŸ‘2🀩1