๐ Learning Objectives
By the end of this lesson, you will be able to:
- โ Understand what JavaScript is and its role in web development
- โ Write and execute basic JavaScript code
- โ Work with variables, data types, and operators
- โ Create and use functions
- โ Manipulate the DOM to change webpage content
- โ Handle user events like clicks and inputs
- โ Make your webpages interactive and dynamic
- โ Debug JavaScript code using browser tools
๐ค What is JavaScript?
JavaScript = The Programming Language of the Web
JavaScript brings websites to life! While HTML provides structure and CSS adds style, JavaScript adds behavior and interactivity. It allows you to create dynamic content, respond to user actions, validate forms, create animations, and build complete web applications.
Think of JavaScript as the brain that makes decisions and controls how your webpage behaves!
๐ฏ The Perfect Team
| Technology | Role | JavaScript Makes It... |
|---|---|---|
| HTML | Structure & Content | Dynamic - change content without reloading |
| CSS | Style & Design | Interactive - animate and respond to users |
| JavaScript | Behavior & Logic | Smart - make decisions and calculations |
โจ What Can JavaScript Do?
๐ฎ Interactive Elements
Buttons, sliders, forms, dropdown menus that respond to user actions
๐ฌ Animations
Smooth transitions, moving elements, and visual effects
โ Form Validation
Check user input before submitting forms
๐ Dynamic Content
Update page content without refreshing
๐ฒ Games
Build interactive games directly in the browser
๐ Data Processing
Calculate, sort, filter, and display data
๐ง How to Add JavaScript to Your Webpage
๐ Three Ways to Include JavaScript
1. Inline JavaScript (Not Recommended)
<button onclick="alert('Hello!')">Click Me</button>
โ ๏ธ Avoid inline JavaScript! It mixes content with behavior and is hard to maintain.
2. Internal JavaScript (For Small Scripts)
<head>
<script>
console.log('Hello, World!');
function greet() {
alert('Welcome to JavaScript!');
}
</script>
</head>
3. External JavaScript (Best Practice!) โ
<!-- In your HTML file, before closing </body> tag -->
<script src="script.js"></script>
</body>
</html>
// In your script.js file
console.log('Hello from external file!');
function greet() {
alert('Welcome to JavaScript!');
}
โ
Best Practice: Use external JavaScript files! Place the <script> tag right before the closing </body> tag so the HTML loads first.
๐ ๏ธ Browser Console
Your JavaScript Playground!
How to Open:
- Windows/Linux: Press
F12orCtrl + Shift + J - Mac: Press
Cmd + Option + J - Any Browser: Right-click โ Inspect โ Console tab
Try typing: console.log('Hello, World!')
๐ JavaScript Basics
๐ฌ Comments
// This is a single-line comment
/*
This is a
multi-line comment
*/
console.log('Hello'); // Comments can go after code too
๐ฆ Variables
Variables store data that you can use and change later. Think of them as labeled boxes that hold information.
Three Ways to Declare Variables:
// let - can be reassigned (most common)
let name = 'John';
let age = 25;
name = 'Jane'; // โ
This works!
// const - cannot be reassigned (use for constants)
const PI = 3.14159;
const birthYear = 2000;
// PI = 3.14; // โ Error! Cannot reassign const
// var - old way (avoid using in modern code)
var oldVariable = 'outdated';
โ Best Practices:
- Use const by default
- Use let when you need to reassign
- Avoid var in modern JavaScript
- Use descriptive names:
userNamenotx - Use camelCase:
firstName,totalPrice
๐ท๏ธ Data Types
| Type | Description | Example |
|---|---|---|
String |
Text data | 'Hello', "World", `Template` |
Number |
Integers and decimals | 42, 3.14, -7 |
Boolean |
True or false | true, false |
Array |
List of values | [1, 2, 3], ['a', 'b'] |
Object |
Collection of properties | {name: 'John', age: 25} |
null |
Intentionally empty | null |
undefined |
Not yet assigned | undefined |
Examples:
// Strings
let firstName = 'Alice';
let lastName = "Smith";
let message = `Hello, ${firstName}!`; // Template literal
// Numbers
let age = 25;
let price = 19.99;
let temperature = -5;
// Booleans
let isStudent = true;
let hasGraduated = false;
// Arrays
let colors = ['red', 'green', 'blue'];
let numbers = [1, 2, 3, 4, 5];
// Objects
let person = {
name: 'John',
age: 30,
isStudent: false
};
// Accessing data
console.log(colors[0]); // 'red'
console.log(person.name); // 'John'
โ Operators
Arithmetic Operators:
let a = 10;
let b = 3;
console.log(a + b); // 13 (addition)
console.log(a - b); // 7 (subtraction)
console.log(a * b); // 30 (multiplication)
console.log(a / b); // 3.333... (division)
console.log(a % b); // 1 (remainder/modulo)
console.log(a ** b); // 1000 (exponentiation)
Comparison Operators:
let x = 5;
console.log(x == 5); // true (equal value)
console.log(x === 5); // true (equal value and type)
console.log(x != 3); // true (not equal value)
console.log(x !== '5'); // true (not equal value or type)
console.log(x > 3); // true (greater than)
console.log(x < 10); // true (less than)
console.log(x >= 5); // true (greater than or equal)
console.log(x <= 5); // true (less than or equal)
โ ๏ธ Use === instead of ==
The === operator checks both value AND type, while == only checks value.
5 == '5' // true (converts string to number)
5 === '5' // false (different types)
Logical Operators:
let age = 25;
let hasLicense = true;
// AND (&&) - both must be true
console.log(age >= 18 && hasLicense); // true
// OR (||) - at least one must be true
console.log(age < 18 || hasLicense); // true
// NOT (!) - reverses boolean
console.log(!hasLicense); // false
๐ Conditionals (If/Else)
let score = 85;
if (score >= 90) {
console.log('Grade: A');
} else if (score >= 80) {
console.log('Grade: B');
} else if (score >= 70) {
console.log('Grade: C');
} else {
console.log('Grade: F');
}
// Ternary operator (shorthand)
let status = score >= 60 ? 'Pass' : 'Fail';
console.log(status); // 'Pass'
๐ Loops
For Loop:
// Count from 1 to 5
for (let i = 1; i <= 5; i++) {
console.log(i);
}
// Output: 1, 2, 3, 4, 5
// Loop through an array
let fruits = ['apple', 'banana', 'orange'];
for (let i = 0; i < fruits.length; i++) {
console.log(fruits[i]);
}
While Loop:
let count = 1;
while (count <= 5) {
console.log(count);
count++;
}
// Output: 1, 2, 3, 4, 5
For...of Loop (Modern way for arrays):
let colors = ['red', 'green', 'blue'];
for (let color of colors) {
console.log(color);
}
// Output: red, green, blue
โ๏ธ Functions
Functions are reusable blocks of code that perform specific tasks. Think of them as recipes you can use over and over again!
๐ Function Declaration
// Define a function
function greet() {
console.log('Hello, World!');
}
// Call the function
greet(); // Output: Hello, World!
// Function with parameters
function greetPerson(name) {
console.log('Hello, ' + name + '!');
}
greetPerson('Alice'); // Output: Hello, Alice!
greetPerson('Bob'); // Output: Hello, Bob!
// Function with return value
function add(a, b) {
return a + b;
}
let sum = add(5, 3);
console.log(sum); // 8
๐ฏ Arrow Functions (Modern Syntax)
// Traditional function
function multiply(a, b) {
return a * b;
}
// Arrow function (shorter syntax)
const multiply = (a, b) => {
return a * b;
};
// Even shorter (when one line)
const multiply = (a, b) => a * b;
// Single parameter (no parentheses needed)
const square = x => x * x;
console.log(square(5)); // 25
๐ Example: Real-World Functions
// Calculate age from birth year
function calculateAge(birthYear) {
const currentYear = new Date().getFullYear();
return currentYear - birthYear;
}
console.log(calculateAge(2000)); // e.g., 25
// Check if number is even
function isEven(number) {
return number % 2 === 0;
}
console.log(isEven(4)); // true
console.log(isEven(7)); // false
// Generate greeting based on time
function getGreeting() {
const hour = new Date().getHours();
if (hour < 12) {
return 'Good morning!';
} else if (hour < 18) {
return 'Good afternoon!';
} else {
return 'Good evening!';
}
}
console.log(getGreeting());
๐ณ DOM Manipulation
The Document Object Model (DOM)
The DOM is a programming interface that represents your HTML as a tree of objects. JavaScript can access and modify this tree to change your webpage dynamically!
๐ฏ Selecting Elements
// Get element by ID
const header = document.getElementById('main-header');
// Get elements by class name (returns collection)
const buttons = document.getElementsByClassName('btn');
// Get elements by tag name
const paragraphs = document.getElementsByTagName('p');
// Modern selectors (recommended!)
const header = document.querySelector('#main-header');
const firstButton = document.querySelector('.btn'); // First match
const allButtons = document.querySelectorAll('.btn'); // All matches
โ๏ธ Changing Content
// Change text content
const heading = document.querySelector('h1');
heading.textContent = 'New Heading!';
// Change HTML content
const div = document.querySelector('#content');
div.innerHTML = '<p>New paragraph</p>';
// Change attributes
const image = document.querySelector('img');
image.src = 'new-image.jpg';
image.alt = 'New description';
// Change styles
const box = document.querySelector('.box');
box.style.backgroundColor = 'blue';
box.style.color = 'white';
box.style.padding = '20px';
โ Creating and Adding Elements
// Create a new element
const newParagraph = document.createElement('p');
newParagraph.textContent = 'This is a new paragraph';
// Add it to the page
const container = document.querySelector('#container');
container.appendChild(newParagraph);
// Create a button with class
const button = document.createElement('button');
button.textContent = 'Click Me';
button.className = 'btn btn-primary';
container.appendChild(button);
๐๏ธ Removing Elements
// Remove an element
const element = document.querySelector('.to-remove');
element.remove();
// Remove child element
const parent = document.querySelector('#parent');
const child = document.querySelector('.child');
parent.removeChild(child);
๐จ Working with Classes
const element = document.querySelector('.box');
// Add a class
element.classList.add('active');
// Remove a class
element.classList.remove('hidden');
// Toggle a class (add if not there, remove if there)
element.classList.toggle('highlight');
// Check if has class
if (element.classList.contains('active')) {
console.log('Element is active!');
}
๐ Complete Example
// HTML
// <div id="app">
// <h1 id="title">Original Title</h1>
// <button id="changeBtn">Change Title</button>
// </div>
// JavaScript
const title = document.querySelector('#title');
const button = document.querySelector('#changeBtn');
// Change title text
title.textContent = 'JavaScript is Awesome!';
// Change title style
title.style.color = '#f59e0b';
title.style.fontSize = '2em';
// Add a new paragraph
const newPara = document.createElement('p');
newPara.textContent = 'This was added with JavaScript!';
newPara.style.color = 'green';
const app = document.querySelector('#app');
app.appendChild(newPara);
๐ฑ๏ธ Event Handling
Events are actions that happen in the browser - clicks, key presses, mouse movements, form submissions, etc. JavaScript can "listen" for these events and respond to them!
๐ฏ Common Events
| Event | When It Happens | Example Use |
|---|---|---|
click |
Element is clicked | Button clicks, menu items |
dblclick |
Element is double-clicked | Edit mode, expand items |
mouseover |
Mouse enters element | Show tooltips, highlights |
mouseout |
Mouse leaves element | Hide tooltips |
keydown |
Key is pressed | Keyboard shortcuts |
keyup |
Key is released | Search as you type |
submit |
Form is submitted | Form validation |
input |
Input value changes | Live validation, counters |
change |
Input loses focus after change | Select dropdowns |
load |
Page finishes loading | Initialize app |
๐ Adding Event Listeners
// Get the element
const button = document.querySelector('#myButton');
// Add event listener
button.addEventListener('click', function() {
alert('Button was clicked!');
});
// Using arrow function
button.addEventListener('click', () => {
alert('Button was clicked!');
});
// Named function (reusable)
function handleClick() {
alert('Button was clicked!');
}
button.addEventListener('click', handleClick);
๐ฏ Click Event Examples
// Change text on click
const heading = document.querySelector('h1');
const button = document.querySelector('#changeBtn');
button.addEventListener('click', () => {
heading.textContent = 'Text Changed!';
});
// Toggle visibility
const toggleBtn = document.querySelector('#toggleBtn');
const content = document.querySelector('#content');
toggleBtn.addEventListener('click', () => {
content.classList.toggle('hidden');
});
// Counter example
let count = 0;
const counterDisplay = document.querySelector('#counter');
const incrementBtn = document.querySelector('#increment');
incrementBtn.addEventListener('click', () => {
count++;
counterDisplay.textContent = count;
});
โจ๏ธ Keyboard Events
// Listen for any key press
document.addEventListener('keydown', (event) => {
console.log('Key pressed:', event.key);
});
// Listen for specific key
document.addEventListener('keydown', (event) => {
if (event.key === 'Enter') {
console.log('Enter key pressed!');
}
});
// Input field validation
const input = document.querySelector('#username');
input.addEventListener('input', (event) => {
const value = event.target.value;
console.log('Current value:', value);
if (value.length < 3) {
input.style.borderColor = 'red';
} else {
input.style.borderColor = 'green';
}
});
๐ฑ๏ธ Mouse Events
const box = document.querySelector('.box');
// Mouse enters
box.addEventListener('mouseover', () => {
box.style.backgroundColor = 'yellow';
});
// Mouse leaves
box.addEventListener('mouseout', () => {
box.style.backgroundColor = 'white';
});
// Double click
box.addEventListener('dblclick', () => {
alert('Double clicked!');
});
๐ Form Events
const form = document.querySelector('#myForm');
form.addEventListener('submit', (event) => {
// Prevent page reload
event.preventDefault();
// Get form data
const name = document.querySelector('#name').value;
const email = document.querySelector('#email').value;
// Validate
if (name === '' || email === '') {
alert('Please fill in all fields!');
return;
}
// Process form
console.log('Name:', name);
console.log('Email:', email);
alert('Form submitted successfully!');
});
๐จ Complete Interactive Example
// HTML
// <div id="app">
// <h1 id="title">Color Changer</h1>
// <button id="redBtn">Red</button>
// <button id="blueBtn">Blue</button>
// <button id="greenBtn">Green</button>
// <div id="box" style="width:200px; height:200px; border:2px solid black;"></div>
// </div>
// JavaScript
const box = document.querySelector('#box');
const redBtn = document.querySelector('#redBtn');
const blueBtn = document.querySelector('#blueBtn');
const greenBtn = document.querySelector('#greenBtn');
redBtn.addEventListener('click', () => {
box.style.backgroundColor = 'red';
});
blueBtn.addEventListener('click', () => {
box.style.backgroundColor = 'blue';
});
greenBtn.addEventListener('click', () => {
box.style.backgroundColor = 'green';
});
๐ก Practical Examples
Example 1: Simple Calculator
// HTML
// <input type="number" id="num1" placeholder="First number">
// <input type="number" id="num2" placeholder="Second number">
// <button id="addBtn">Add</button>
// <p id="result"></p>
const num1Input = document.querySelector('#num1');
const num2Input = document.querySelector('#num2');
const addBtn = document.querySelector('#addBtn');
const result = document.querySelector('#result');
addBtn.addEventListener('click', () => {
const num1 = parseFloat(num1Input.value);
const num2 = parseFloat(num2Input.value);
if (isNaN(num1) || isNaN(num2)) {
result.textContent = 'Please enter valid numbers!';
result.style.color = 'red';
} else {
const sum = num1 + num2;
result.textContent = `Result: ${sum}`;
result.style.color = 'green';
}
});
Example 2: To-Do List
// HTML
// <input type="text" id="taskInput" placeholder="Enter a task">
// <button id="addTaskBtn">Add Task</button>
// <ul id="taskList"></ul>
const taskInput = document.querySelector('#taskInput');
const addTaskBtn = document.querySelector('#addTaskBtn');
const taskList = document.querySelector('#taskList');
addTaskBtn.addEventListener('click', () => {
const taskText = taskInput.value.trim();
if (taskText === '') {
alert('Please enter a task!');
return;
}
// Create list item
const li = document.createElement('li');
li.textContent = taskText;
// Create delete button
const deleteBtn = document.createElement('button');
deleteBtn.textContent = 'Delete';
deleteBtn.addEventListener('click', () => {
li.remove();
});
// Add button to list item
li.appendChild(deleteBtn);
// Add list item to list
taskList.appendChild(li);
// Clear input
taskInput.value = '';
});
Example 3: Dark Mode Toggle
// HTML
// <button id="themeToggle">Toggle Dark Mode</button>
// CSS
// body.dark-mode {
// background-color: #1a202c;
// color: white;
// }
const toggleBtn = document.querySelector('#themeToggle');
toggleBtn.addEventListener('click', () => {
document.body.classList.toggle('dark-mode');
if (document.body.classList.contains('dark-mode')) {
toggleBtn.textContent = 'Light Mode';
} else {
toggleBtn.textContent = 'Dark Mode';
}
});
Example 4: Form Validation
// HTML
// <form id="signupForm">
// <input type="text" id="username" placeholder="Username">
// <span id="usernameError"></span>
// <input type="email" id="email" placeholder="Email">
// <span id="emailError"></span>
// <input type="password" id="password" placeholder="Password">
// <span id="passwordError"></span>
// <button type="submit">Sign Up</button>
// </form>
const form = document.querySelector('#signupForm');
const username = document.querySelector('#username');
const email = document.querySelector('#email');
const password = document.querySelector('#password');
form.addEventListener('submit', (event) => {
event.preventDefault();
let isValid = true;
// Validate username
if (username.value.length < 3) {
document.querySelector('#usernameError').textContent =
'Username must be at least 3 characters';
isValid = false;
} else {
document.querySelector('#usernameError').textContent = '';
}
// Validate email
if (!email.value.includes('@')) {
document.querySelector('#emailError').textContent =
'Please enter a valid email';
isValid = false;
} else {
document.querySelector('#emailError').textContent = '';
}
// Validate password
if (password.value.length < 6) {
document.querySelector('#passwordError').textContent =
'Password must be at least 6 characters';
isValid = false;
} else {
document.querySelector('#passwordError').textContent = '';
}
if (isValid) {
alert('Form submitted successfully!');
form.reset();
}
});
๐ฏ JavaScript Activities & Projects
โก Activity 1: Interactive Greeting
โฑ๏ธ Time: 20 minutes
Task: Create a webpage that greets the user by name
๐ Requirements:
- โ HTML with an input field for name
- โ A button that says "Greet Me"
- โ Display area for the greeting
- โ JavaScript that gets the name from input
- โ Display personalized greeting when button clicked
- โ Handle empty input (show error message)
- โ Use external JavaScript file
๐ก Bonus Challenges:
- ๐ฏ Change greeting based on time of day
- ๐ฏ Add animation when greeting appears
- ๐ฏ Allow pressing Enter to submit
๐จ Activity 2: Color Picker Tool
โฑ๏ธ Time: 30 minutes
Task: Build a tool that changes the background color
๐ Requirements:
- โ At least 5 color buttons
- โ Each button changes page background color
- โ Display current color name
- โ Random color button
- โ Reset button (back to original)
- โ Use event listeners for all buttons
- โ Smooth color transitions with CSS
๐ก Bonus Challenges:
- ๐ฏ Add RGB sliders to create custom colors
- ๐ฏ Show hex color code
- ๐ฏ Copy color code to clipboard button
โ Homework: Simple To-Do List App
๐ Due: Next class session
Task: Create a fully functional to-do list application
๐ Requirements:
- โ Input field to enter tasks
- โ Add button to create new tasks
- โ Display list of all tasks
- โ Delete button for each task
- โ Mark tasks as complete (cross out or style change)
- โ Clear all completed tasks button
- โ Show total number of tasks
- โ Empty input validation
- โ Styled with CSS (make it look good!)
- โ Use semantic HTML
- โ Clean, commented JavaScript code
๐ Stretch Goals (Extra Credit):
- ๐ฏ Edit tasks after creating them
- ๐ฏ Priority levels (high, medium, low) with colors
- ๐ฏ Filter tasks (all, active, completed)
- ๐ฏ Due dates for tasks
- ๐ฏ Save tasks to localStorage (persist on reload)
- ๐ฏ Drag and drop to reorder tasks
๐ Grading Rubric (100 points):
| Category | Points | Description |
|---|---|---|
| HTML Structure | 15 | Proper semantic HTML, organized |
| CSS Styling | 20 | Professional appearance, good UX |
| Core Functionality | 35 | Add, delete, complete tasks work correctly |
| Code Quality | 20 | Clean code, comments, best practices |
| Extra Features | 10 | Going beyond requirements, creativity |
๐ Debugging JavaScript
๐ ๏ธ Common Errors
| Error Type | What It Means | How to Fix |
|---|---|---|
SyntaxError |
Invalid JavaScript syntax | Check for missing brackets, quotes, semicolons |
ReferenceError |
Variable doesn't exist | Check variable names, make sure it's declared |
TypeError |
Wrong data type used | Check what type of value you're using |
Undefined |
Variable has no value | Initialize variable or check if element exists |
๐ง Debugging Tools
Console Methods:
// Display values
console.log('Hello');
console.log('Value:', myVariable);
// Display warnings
console.warn('This is a warning!');
// Display errors
console.error('This is an error!');
// Display objects nicely
console.table([{name: 'Alice', age: 25}, {name: 'Bob', age: 30}]);
// Group related logs
console.group('User Info');
console.log('Name: John');
console.log('Age: 25');
console.groupEnd();
๐ก Debugging Tips
- ๐ Use
console.log()to check values - ๐ Check browser console for error messages
- ๐ Use browser DevTools debugger (set breakpoints)
- ๐ Check if elements exist before using them
- ๐ Verify script is loaded (check Network tab)
- ๐ Make sure script tag is before closing body tag
- ๐ Check for typos in variable and function names
- ๐ Use strict mode:
'use strict';at top of file
โ JavaScript Best Practices
๐ Coding Standards
- โ Use const by default, let when reassigning
- โ
Use descriptive variable names:
userNamenotun - โ
Use camelCase for variables:
myVariableName - โ
Use PascalCase for classes:
MyClass - โ
Use UPPER_CASE for constants:
MAX_SIZE - โ Add comments to explain complex code
- โ Use === instead of ==
- โ Always use semicolons
- โ Keep functions small and focused
- โ Use arrow functions for simple functions
- โ Validate user input
- โ Handle errors gracefully
โ Bad Practice
var x = 5
var y = 10
function a(b) {
return b * 2
}
if (x == '5') {
console.log("yes")
}
โ Good Practice
const multiplier = 5;
const baseValue = 10;
function doubleNumber(number) {
return number * 2;
}
if (multiplier === 5) {
console.log('Multiplier is 5');
}
๐ JavaScript Resources
๐ Learning Resources
๐ You've Learned JavaScript Basics!
What You Now Know:
- โ What JavaScript is and how it works with HTML/CSS
- โ Variables, data types, and operators
- โ Conditionals and loops
- โ Functions and how to create reusable code
- โ DOM manipulation to change webpage content
- โ Event handling to respond to user actions
- โ Debugging techniques and best practices
- โ How to build interactive web applications
๐ Next Steps in Your JavaScript Journey
๐ฏ Practice Daily
Build small projects every day. The more you code, the better you get!
๐ง Master the DOM
Get comfortable manipulating HTML elements with JavaScript.
๐ Learn Array Methods
map(), filter(), reduce() - powerful tools for data manipulation.
โก Async JavaScript
Learn Promises, async/await for handling asynchronous operations.
๐จ Modern Frameworks
React, Vue, Angular - build complex applications faster.
๐ APIs & Fetch
Connect to external data sources and build dynamic apps.
โ Before You Go - Action Items:
- โ Complete Activity 1: Interactive Greeting
- โ Complete Activity 2: Color Picker Tool
- โ Start Homework: To-Do List App
- โ Practice in browser console daily
- โ Build at least one small project per week
- โ Join JavaScript communities online
- โ Read documentation regularly
Keep Coding! โกโจ
JavaScript makes the web interactive and alive!
Every interactive website you love was built with JavaScript.
You're now ready to build amazing things! ๐
๐บ๏ธ Your Complete Web Development Path
Congratulations on Completing the Fundamentals!
You now have the three essential skills needed for web development:
- โ HTML - Structure your content
- โ CSS - Style and design
- โ JavaScript - Add interactivity and behavior
๐ฏ Where to Go from Here
๐๏ธ Build Projects
Portfolio Site, Blog, Calculator, Weather App, Quiz Game
Apply everything you've learned by building real projects.
๐ฑ Responsive Design
Mobile-first, Flexbox, Grid, Media Queries
Make your sites work perfectly on all devices.
๐จ Advanced CSS
Animations, Transitions, CSS Variables, Sass
Create beautiful, animated user interfaces.
โก Advanced JavaScript
ES6+, Async/Await, APIs, Local Storage
Master modern JavaScript features.
๐ ๏ธ Developer Tools
Git, GitHub, VS Code, Chrome DevTools
Learn professional development tools.
โ๏ธ Frameworks
React, Vue, Node.js, Express
Build complex applications faster.