Skip to main content

Course Progress

Loading...

JavaScript Fundamentals

Duration: 45 minutes
Module 1: JavaScript Fundamentals

Learning Objectives

  • Understand JavaScript fundamentals
  • Add interactivity to web pages
  • Manipulate page elements dynamically
  • Handle user interactions

Welcome to the World of JavaScript

JavaScript is the beating heart of the modern web. While HTML provides structure and CSS adds style, JavaScript breathes life into websites, making them interactive, dynamic, and responsive to user actions. Think of HTML as the skeleton, CSS as the skin and clothing, and JavaScript as the muscles and nervous system that allow movement and reaction.

                    graph TD
                    A[Web Development] --> B[HTML: Structure]
                    A --> C[CSS: Presentation]
                    A --> D[JavaScript: Behavior]
                    B --> E[Skeleton]
                    C --> F[Appearance]
                    D --> G[Interactivity]
                    D --> H[Dynamic Content]
                    D --> I[User Experience]
                

Originally created in just 10 days by Brendan Eich in 1995, JavaScript has evolved from a simple scripting language to a powerful programming language capable of running complex applications both in browsers and on servers. Despite sharing a similar name, JavaScript is not related to Java—it was named to capitalize on Java's popularity at the time.

The Role of JavaScript in Web Development

JavaScript uniquely positions itself as the only programming language natively supported by all major web browsers. This universal compatibility makes it an essential skill for web developers.

What JavaScript Can Do

  • Manipulate HTML Content - Dynamically change what users see
  • Respond to User Events - React to clicks, form submissions, keyboard input
  • Validate Form Data - Check user input before sending to servers
  • Create Animations and Visual Effects - Bring pages to life with movement
  • Fetch Data Asynchronously - Update parts of a page without reloading
  • Store Data Locally - Remember information between visits
  • Build Complete Applications - Create sophisticated web apps

Real-World Example: The Silent Helper

Every time you type in a search box and see suggestions appear, JavaScript is working behind the scenes. When you scroll through an infinite feed on social media, JavaScript is fetching new content. When a form tells you your password is too weak before you submit it, JavaScript is validating your input.

                    sequenceDiagram
                    participant User
                    participant Browser
                    participant JavaScript
                    participant Server
                    
                    User->>Browser: Types in search box
                    Browser->>JavaScript: Triggers input event
                    JavaScript->>Server: Requests suggestions
                    Server->>JavaScript: Returns suggestion data
                    JavaScript->>Browser: Updates suggestion dropdown
                    Browser->>User: Displays suggestions
                

Setting Up Your JavaScript Environment

One of the beautiful aspects of JavaScript is its accessibility—all you need is a text editor and a web browser! Let's set up a simple environment to practice:

Your First JavaScript File

<!-- In an HTML file named index.html -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>JavaScript Practice</title>
    <!-- External JavaScript file -->
    <script src="script.js" defer></script>
</head>
<body>
    <h1>My JavaScript Playground</h1>
    <p id="demo">This text will change.</p>
    <button id="clickMe">Click Me!</button>
</body>
</html>
// In a JavaScript file named script.js
document.getElementById("clickMe").addEventListener("click", function() {
    document.getElementById("demo").textContent = "JavaScript changed this!";
});

Useful Developer Tools

Modern browsers include powerful developer tools to help you write and debug JavaScript:

  • Console - See output, errors, and run JavaScript directly
  • Debugger - Step through your code to find issues
  • Network Panel - Monitor requests and responses

To access these tools in most browsers, press F12 or right-click and select "Inspect".

JavaScript Syntax Fundamentals

Like any language, JavaScript has its own grammar and punctuation rules. Understanding these basics helps build a solid foundation.

Key Syntax Rules

  • JavaScript is case-sensitive - myVariable and myvariable are different
  • Statements end with semicolons ; (though they're often optional)
  • Code blocks are enclosed in curly braces { }
  • Comments use // for single line and /* */ for multiple lines
  • JavaScript ignores extra whitespace (but good indentation improves readability)

Syntax Examples

// This is a single-line comment
/* This is a 
   multi-line comment */

// Statement ending with semicolon
let greeting = "Hello, world!";

// Code block with curly braces
if (greeting.length > 5) {
    console.log("That's a long greeting!");
    console.log("It has " + greeting.length + " characters.");
}

// CamelCase is the conventional naming style
let myVariableName = "follows camelCase convention";

Naming Conventions

JavaScript developers typically use these naming patterns:

  • camelCase for variables and functions (firstName, calculateTotal)
  • PascalCase for classes and constructors (Person, ShoppingCart)
  • UPPERCASE_WITH_UNDERSCORES for constants (MAX_USERS, API_KEY)

Using these conventions makes your code more readable and maintainable.

Variables: Storing and Managing Data

Variables are like labeled containers that hold data in your program. Think of them as sticky notes that refer to pieces of information you want to remember and use later.

userName "JohnDoe" userAge 28 isAdmin false Computer Memory

Declaring Variables

JavaScript offers three ways to declare variables, each with different behaviors:

// Using let - recommended for variables that will change
let score = 0;
score = 10; // This is allowed - we can change it

// Using const - for values that shouldn't change
const PI = 3.14159;
// PI = 3; // This would cause an error!

// Using var - older way, less recommended in modern code
var temperature = 72;
temperature = 75; // This is allowed

Comparing Variable Declarations

Feature let const var
Reassignment Yes No Yes
Block Scope Yes Yes No
Hoisting Hoisted but not initialized Hoisted but not initialized Hoisted and initialized as undefined
Modern Usage Recommended Recommended Not recommended

When to Use Each Declaration

  • Use const by default - it prevents accidental changes
  • Use let when you need to reassign values (like counters or accumulating results)
  • Avoid var in new code - it has confusing scoping rules

Real-World Example: Shopping Cart

// Constants don't change throughout the program
const TAX_RATE = 0.08;
const SHIPPING_THRESHOLD = 50;

// These values will change as we shop
let cartTotal = 0;
let itemCount = 0;

function addItem(price) {
    // Update variables with new values
    cartTotal += price;
    itemCount++;
    
    // Calculate final charges
    let finalTotal = cartTotal * (1 + TAX_RATE);
    const freeShipping = cartTotal > SHIPPING_THRESHOLD;
    
    console.log(`Cart: ${itemCount} items, $${cartTotal.toFixed(2)}`);
    console.log(`Final total with tax: $${finalTotal.toFixed(2)}`);
    console.log(`Free shipping: ${freeShipping ? "Yes!" : "No"}`);
}

Data Types: The Building Blocks of Information

JavaScript has various types of data, each serving different purposes. Think of data types as different materials—some are solid like numbers, some are flexible like strings, and some are binary like booleans.

                graph TD
                    A[JavaScript Data Types] --> B[Primitive Types]
                    A --> C[Reference Types]
                    B --> D[String]
                    B --> E[Number]
                    B --> F[Boolean]
                    B --> G[Undefined]
                    B --> H[Null]
                    B --> I[Symbol]
                    B --> J[BigInt]
                    C --> K[Objects]
                    K --> L[Plain Objects]
                    K --> M[Arrays]
                    K --> N[Functions]
                    K --> O[Dates]
                    K --> P[Regular Expressions]
            

Primitive Data Types

Primitive types are the most basic data types in JavaScript. They are immutable (cannot be changed) and are passed by value.

String

Strings represent text and are created with single quotes, double quotes, or backticks.

// String examples
let firstName = "John";
let lastName = 'Doe';
let greeting = `Hello, ${firstName} ${lastName}!`; // Template literal

console.log(greeting); // "Hello, John Doe!"
console.log(firstName.length); // 4
console.log(firstName.toUpperCase()); // "JOHN"

Number

Numbers in JavaScript can be integers or floating-point values. There's no separate integer type.

// Number examples
let age = 25; // Integer
let price = 19.99; // Floating-point
let discount = 0.15; // Percentage as decimal
let negativeValue = -42;

// Special number values
let infinity = Infinity;
let notANumber = NaN; // Result of invalid calculations

console.log(10 / 3); // 3.3333333333333335
console.log(Math.floor(10 / 3)); // 3

Boolean

Booleans have only two possible values: true or false. They're essential for conditional logic.

// Boolean examples
let isUserLoggedIn = true;
let hasPermission = false;

// Comparison operations result in booleans
let isAdult = age >= 18; // true if age is 18 or more

// Logical operators with booleans
let canAccessContent = isUserLoggedIn && hasPermission; // AND
let shouldShowLogin = !isUserLoggedIn; // NOT

Undefined and Null

These represent the absence of a value, but in slightly different ways.

// Undefined - variable declared but not assigned a value
let username;
console.log(username); // undefined

// Null - explicitly assigned "no value"
let selectedItem = null; // We intentionally set it to "nothing"

Symbol and BigInt

These are newer primitive types for specific use cases.

// Symbol - used for unique identifiers
const id = Symbol("id");

// BigInt - for integers larger than Number can safely handle
const bigNumber = 9007199254740991n; // Note the 'n' at the end

Reference Data Types

Reference types are more complex and are passed by reference, meaning variables point to the data's location in memory rather than containing the data directly.

Objects

Objects store collections of related data and functionality as key-value pairs.

// Object example
const person = {
    firstName: "Jane",
    lastName: "Smith",
    age: 32,
    email: "jane@example.com",
    isEmployed: true,
    address: {
        street: "123 Main St",
        city: "Anytown",
        zipCode: "12345"
    },
    greet: function() {
        return `Hello, my name is ${this.firstName}!`;
    }
};

// Accessing object properties
console.log(person.firstName); // "Jane"
console.log(person["lastName"]); // "Smith"
console.log(person.address.city); // "Anytown"
console.log(person.greet()); // "Hello, my name is Jane!"

Arrays

Arrays are ordered collections of values, accessed by numeric indices starting at 0.

// Array example
const colors = ["red", "green", "blue"];
const mixedArray = [42, "hello", true, { id: 1 }, [1, 2, 3]];

// Accessing array elements
console.log(colors[0]); // "red"
console.log(colors.length); // 3

// Common array operations
colors.push("yellow"); // Add to end
console.log(colors); // ["red", "green", "blue", "yellow"]

colors.pop(); // Remove from end
console.log(colors); // ["red", "green", "blue"]

// Iterating through an array
colors.forEach(function(color) {
    console.log(color);
});

Functions

Functions are reusable blocks of code that perform a specific task or calculate a value.

// Function declarations
function addNumbers(a, b) {
    return a + b;
}

// Function expressions
const multiply = function(a, b) {
    return a * b;
};

// Arrow functions (ES6+)
const divide = (a, b) => a / b;

// Using functions
console.log(addNumbers(5, 3)); // 8
console.log(multiply(4, 2)); // 8
console.log(divide(10, 2)); // 5

Type Checking and Conversion

// Checking types
console.log(typeof "hello"); // "string"
console.log(typeof 42); // "number"
console.log(typeof true); // "boolean"
console.log(typeof {}); // "object"
console.log(typeof []); // "object" (arrays are objects!)
console.log(typeof function() {}); // "function"

// Type conversion
let numString = "42";
let num = Number(numString); // Convert to number
console.log(num + 8); // 50

let numToString = String(num); // Convert to string
console.log(numToString + 8); // "428"

// Automatic type conversion (be careful!)
console.log("5" + 2); // "52" (string concatenation)
console.log("5" - 2); // 3 (number subtraction)
console.log("5" * "2"); // 10 (number multiplication)

JavaScript Type Quirks and Gotchas

JavaScript has some behaviors that can surprise developers coming from other languages. Understanding these quirks helps avoid common bugs.

Truthy and Falsy Values

In JavaScript, values can be evaluated as either "truthy" or "falsy" in boolean contexts.

// Falsy values - these evaluate to false in conditionals
console.log(Boolean(0)); // false
console.log(Boolean("")); // false
console.log(Boolean(null)); // false
console.log(Boolean(undefined)); // false
console.log(Boolean(NaN)); // false
console.log(Boolean(false)); // false

// Everything else is truthy
console.log(Boolean(1)); // true
console.log(Boolean("hello")); // true
console.log(Boolean([])); // true (empty array is truthy!)
console.log(Boolean({})); // true (empty object is truthy!)

// This behavior affects conditionals
let userName = "";
if (userName) {
    console.log("Hello, " + userName);
} else {
    console.log("Please enter your name"); // This runs because "" is falsy
}

Equality Comparisons

JavaScript has two types of equality operators with different behaviors.

// Loose equality (==) performs type conversion
console.log(5 == "5"); // true
console.log(0 == false); // true
console.log("" == 0); // true

// Strict equality (===) checks value and type
console.log(5 === "5"); // false
console.log(0 === false); // false
console.log("" === 0); // false

// Best practice: Use === for predictable behavior

Real-World Example: Form Validation

function validateForm(formData) {
    // Check for empty values
    if (!formData.username) { // "" is falsy
        return "Username is required";
    }
    
    // Check numeric values
    const age = Number(formData.age);
    if (isNaN(age)) {
        return "Age must be a number";
    }
    
    if (age < 18) {
        return "You must be 18 or older";
    }
    
    // Check email format with a simple regex
    const emailPattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
    if (!emailPattern.test(formData.email)) {
        return "Invalid email format";
    }
    
    // All validations passed
    return null; // No error
}

Putting It All Together: Practical Examples

Interactive User Greeting

// HTML:
// <input id="nameInput" type="text" placeholder="Enter your name">
// <button id="greetButton">Greet Me</button>
// <p id="greetingOutput"></p>

// JavaScript:
const nameInput = document.getElementById("nameInput");
const greetButton = document.getElementById("greetButton");
const greetingOutput = document.getElementById("greetingOutput");

// Event listener for button click
greetButton.addEventListener("click", function() {
    // Get the input value
    const userName = nameInput.value;
    
    // Check if input is empty
    if (!userName) {
        greetingOutput.textContent = "Please enter your name first!";
        greetingOutput.style.color = "red";
        return;
    }
    
    // Create personalized greeting based on time of day
    const currentHour = new Date().getHours();
    let greeting;
    
    if (currentHour < 12) {
        greeting = "Good morning";
    } else if (currentHour < 18) {
        greeting = "Good afternoon";
    } else {
        greeting = "Good evening";
    }
    
    // Display the greeting
    greetingOutput.textContent = `${greeting}, ${userName}!`;
    greetingOutput.style.color = "green";
});

Shopping Cart Total Calculator

// Product catalog
const products = [
    { id: 1, name: "T-shirt", price: 19.99 },
    { id: 2, name: "Jeans", price: 49.99 },
    { id: 3, name: "Shoes", price: 79.99 },
    { id: 4, name: "Hat", price: 14.99 }
];

// Shopping cart
let cart = [];

// Function to add an item to cart
function addToCart(productId, quantity = 1) {
    // Find the product in our catalog
    const product = products.find(item => item.id === productId);
    
    if (!product) {
        console.log("Product not found!");
        return;
    }
    
    // Check if product already exists in cart
    const existingItem = cart.find(item => item.productId === productId);
    
    if (existingItem) {
        // Update quantity if already in cart
        existingItem.quantity += quantity;
    } else {
        // Add new item to cart
        cart.push({
            productId: product.id,
            name: product.name,
            price: product.price,
            quantity: quantity
        });
    }
    
    console.log(`Added ${quantity} ${product.name}(s) to cart`);
    displayCartSummary();
}

// Calculate and display cart totals
function displayCartSummary() {
    // Initialize variables
    let itemCount = 0;
    let subtotal = 0;
    const TAX_RATE = 0.08;
    const FREE_SHIPPING_THRESHOLD = 75;
    
    // Calculate totals
    cart.forEach(item => {
        itemCount += item.quantity;
        subtotal += item.price * item.quantity;
    });
    
    // Calculate additional values
    const tax = subtotal * TAX_RATE;
    const shipping = subtotal >= FREE_SHIPPING_THRESHOLD ? 0 : 9.99;
    const total = subtotal + tax + shipping;
    
    // Display results
    console.log("=== CART SUMMARY ===");
    console.log(`Items in cart: ${itemCount}`);
    console.log(`Subtotal: $${subtotal.toFixed(2)}`);
    console.log(`Tax (8%): $${tax.toFixed(2)}`);
    console.log(`Shipping: $${shipping.toFixed(2)}`);
    console.log(`TOTAL: $${total.toFixed(2)}`);
    console.log("===================");
}

// Test our functions
addToCart(1, 2); // 2 T-shirts
addToCart(3, 1); // 1 pair of shoes
addToCart(1, 1); // 1 more T-shirt (should update quantity)

Debugging JavaScript

Debugging is an essential skill for JavaScript developers. The browser console is your best friend for troubleshooting issues.

Useful Console Methods

// Basic logging
console.log("Hello world"); // General purpose logging

// Different log levels
console.info("This is informational"); // Info-level message
console.warn("Something might be wrong"); // Warning-level message
console.error("Something went wrong!"); // Error-level message

// Organizing with groups
console.group("User Details");
console.log("Name: John Doe");
console.log("Age: 32");
console.log("Role: Administrator");
console.groupEnd();

// Performance measurement
console.time("Operation Timer");
// ...some code here...
console.timeEnd("Operation Timer"); // Shows elapsed time

// Visual inspection of objects
const complexObject = { 
    user: { name: "Jane", role: "Editor" },
    permissions: ["read", "write", "delete"],
    active: true
};
console.dir(complexObject); // Interactive object view

Common JavaScript Bugs and Fixes

  • Undefined Variables - Always check if your variables exist before using them
  • Type Errors - Use strict equality (===) and check types when necessary
  • Scope Issues - Be aware of variable scope, especially with let vs var
  • Asynchronous Bugs - Remember that some operations don't complete immediately
  • Typos - JavaScript is case-sensitive; userName and username are different variables

JavaScript Best Practices

Following established best practices helps you write cleaner, more maintainable code.

Code Quality Guidelines

  • Use descriptive variable names - firstName is better than fn
  • Keep functions small and focused - Each function should do one thing well
  • Comment complex code - Explain why, not what (the code shows what)
  • Use consistent formatting - Indent properly and follow a style guide
  • Avoid global variables - Limit variable scope to where it's needed
  • Handle errors gracefully - Use try/catch for operations that might fail
  • Use strict equality - Prefer === over ==
  • Declare variables at the top - Makes it clear what variables the function uses

Before and After: Improving Code Quality

Before

// Poor quality code
function calc(a,b,t) {
    var res;
    if(t=="add") {
        res=a+b
    }
    if(t=="subtract") {
        res=a-b
    }
    if(t=="multiply") {
        res=a*b
    }
    if(t=="divide") {
        res=a/b
    }
    return res;
}

After

// Improved version
/**
 * Performs a basic arithmetic operation on two numbers.
 * @param {number} firstNumber - The first operand
 * @param {number} secondNumber - The second operand
 * @param {string} operation - The operation to perform (add/subtract/multiply/divide)
 * @returns {number} The result of the operation
 */
function calculate(firstNumber, secondNumber, operation) {
    // Validate input types
    if (typeof firstNumber !== 'number' || typeof secondNumber !== 'number') {
        throw new Error('Both operands must be numbers');
    }
    
    // Perform calculation based on operation type
    switch (operation) {
        case "add":
            return firstNumber + secondNumber;
        case "subtract":
            return firstNumber - secondNumber;
        case "multiply":
            return firstNumber * secondNumber;
        case "divide":
            // Check for division by zero
            if (secondNumber === 0) {
                throw new Error('Cannot divide by zero');
            }
            return firstNumber / secondNumber;
        default:
            throw new Error('Invalid operation. Use add, subtract, multiply, or divide');
    }
}

Additional Resources

Continue your JavaScript learning journey with these valuable resources:

Documentation

Practice Platforms

Books

  • "Eloquent JavaScript" by Marijn Haverbeke
  • "JavaScript: The Good Parts" by Douglas Crockford
  • "You Don't Know JS" series by Kyle Simpson

Practice Exercises

Reinforce your learning with these hands-on exercises:

Beginner Exercises

  1. Variable Practice: Create variables of each data type and log them to the console
  2. Temperature Converter: Write a function that converts Celsius to Fahrenheit
  3. String Manipulator: Create functions that capitalize a string, reverse a string, and count vowels

Intermediate Exercises

  1. Shopping List App: Create an array of items with add, remove, and display functions
  2. Tip Calculator: Calculate bill total with tip based on service quality
  3. Word Counter: Count words, characters, and sentences in a text input

Advanced Exercises

  1. Todo List: Create a complete todo list with add, delete, edit, and status toggle functionality
  2. Quiz App: Build a simple multiple-choice quiz with scoring
  3. Calculator: Implement a calculator with basic operations and memory functions