Master JavaScript through hands-on coding challenges. Write real code, get instant feedback, and build practical web development skills.
Learn to handle errors gracefully, organize code with modules, and persist data in the browser.
try {
// Code that might throw an error
const result = riskyOperation();
console.log("Success:", result);
} catch (error) {
// Handle the error
console.error("Error occurred:", error.message);
}try {
const file = openFile("data.txt");
processFile(file);
} catch (error) {
console.error("Failed to process file:", error);
} finally {
// Always runs - perfect for cleanup!
closeFile(file);
console.log("Cleanup complete");
}function validateAge(age) {
if (typeof age !== "number") {
throw new TypeError("Age must be a number");
}
if (age < 0 || age > 150) {
throw new RangeError("Age must be between 0 and 150");
}
return true;
}
try {
validateAge("twenty"); // Will throw TypeError
} catch (error) {
console.error(error.name + ": " + error.message);
}class ValidationError extends Error {
constructor(message, field) {
super(message);
this.name = "ValidationError";
this.field = field;
}
}
class NetworkError extends Error {
constructor(message, statusCode) {
super(message);
this.name = "NetworkError";
this.statusCode = statusCode;
}
}
throw new ValidationError("Invalid email format", "email");try {
doSomethingRisky();
} catch (error) {
if (error instanceof TypeError) {
console.error("Type error:", error.message);
} else if (error instanceof RangeError) {
console.error("Range error:", error.message);
} else if (error instanceof ValidationError) {
console.error("Validation failed on:", error.field);
} else {
console.error("Unknown error:", error);
throw error; // Re-throw if we can't handle it
}
}try {
throw new Error("Something went wrong!");
} catch (error) {
console.log("Name:", error.name); // "Error"
console.log("Message:", error.message); // "Something went wrong!"
console.log("Stack:", error.stack); // Full stack trace
}finally for cleanup (closing connections, files, etc.)Trying risky operation...
Error caught: TypeError - Invalid input type
Validation error on field: email
Custom error handled!
Cleanup complete in finally block
try { } catch (error) { }try { } catch { } finally { }throw new Error("message")class MyError extends Error { }error instanceof TypeErrorerror.name, error.messageReview feedback below
// math.js
export const PI = 3.14159;
export function add(a, b) {
return a + b;
}
export function multiply(a, b) {
return a * b;
}
export class Calculator {
// ...
}// main.js
import { PI, add, multiply } from "./math.js";
console.log(PI); // 3.14159
console.log(add(2, 3)); // 5
console.log(multiply(4, 5)); // 20
// Import with alias
import { add as sum } from "./math.js";
console.log(sum(1, 2)); // 3// logger.js
export default function log(message) {
console.log(`[LOG] ${message}`);
}
// Or export a class as default
export default class Logger {
log(msg) { console.log(msg); }
}// main.js
import log from "./logger.js";
import myLogger from "./logger.js"; // Can use any name!
log("Hello!");
myLogger("World!");// utils.js
export default function main() { }
export const helper1 = () => { };
export const helper2 = () => { };
// Import both:
import main, { helper1, helper2 } from "./utils.js";// main.js
import * as MathUtils from "./math.js";
console.log(MathUtils.PI);
console.log(MathUtils.add(1, 2));
console.log(MathUtils.multiply(3, 4));.js is required in browser importstype="module" to script tag: <script type="module">type="module" in HTMLNamed export PI: 3.14159
add(2, 3) = 5
Default export called!
Namespace import: MathUtils.multiply(4, 5) = 20
export const name = valueimport { name } from "./file.js"export default function() { }import name from "./file.js"import * as Utils from "./file.js"import { old as new } from "./file.js"Review feedback below
localStorage.setItem() - Store key-value pairs (strings only!).// Basic usage - stores strings
localStorage.setItem("username", "john_doe");
localStorage.setItem("theme", "dark");
localStorage.setItem("volume", "80");
// Check if it worked
console.log("Saved username:", localStorage.getItem("username"));localStorage.getItem() - Get values by key.const username = localStorage.getItem("username");
const theme = localStorage.getItem("theme");
const nonExistent = localStorage.getItem("xyz"); // Returns null
console.log(username); // "john_doe"
console.log(nonExistent); // null
// Always check for null!
if (localStorage.getItem("theme")) {
applyTheme(localStorage.getItem("theme"));
}// Storing objects/arrays
const user = {
name: "John",
age: 30,
preferences: ["dark mode", "notifications"]
};
// Must stringify before storing!
localStorage.setItem("user", JSON.stringify(user));
// Retrieve and parse
const storedUser = JSON.parse(localStorage.getItem("user"));
console.log(storedUser.name); // "John"
console.log(storedUser.preferences[0]); // "dark mode"removeItem() and clear()// Remove single item
localStorage.removeItem("username");
// Clear ALL localStorage data (use carefully!)
localStorage.clear();
// Check storage length
console.log("Items stored:", localStorage.length);// Identical API to localStorage
sessionStorage.setItem("tempData", "This disappears on tab close");
const temp = sessionStorage.getItem("tempData");
// Use for:
// - Form data in progress
// - Single-session authentication
// - Temporary UI state// Check if localStorage is available
function storageAvailable() {
try {
const test = "__storage_test__";
localStorage.setItem(test, test);
localStorage.removeItem(test);
return true;
} catch (e) {
return false;
}
}
// Safe storage wrapper
function safeSetItem(key, value) {
try {
localStorage.setItem(key, JSON.stringify(value));
return true;
} catch (error) {
console.error("Storage error:", error.message);
return false; // Quota exceeded or private browsing
}
}window.addEventListener("storage", handler)Saved: username = john_doe
Retrieved: john_doe
Stored object: { name: "John", age: 30 }
Parsed user.name: John
Items in storage: 2
Removed username, remaining: 1
localStorage.setItem("key", "value")localStorage.getItem("key")JSON.stringify(obj)JSON.parse(string)localStorage.removeItem("key")sessionStorage.setItem("key", "value")Review feedback below